|
05.09.2011, 22:24
|
#1
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Столкновение с боксом
Получилось определить столкновение с боксом но не пойму как сделать реальное скольжение по его сторонам
ЗЫ раньше делал столкновение со сферой там куда проше(с помощью синуса и косинуса по трём осям), а как с боксом быть незнаю
|
(Offline)
|
|
05.09.2011, 22:54
|
#2
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Столкновение с боксом
Если правильно понял:
У тебя есть вектор скорости. есть точка столкновения. есть нормаль поверхности с которой произошел контакт.
Проецируешь на нормаль вектор скорости. вычитаешь из вектора скорости вектор нормали умноженный на длину проекции. Это будет остаток скорости вдоль поверхности с которой произошло столкновение.
|
(Offline)
|
|
05.09.2011, 23:01
|
#3
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: Столкновение с боксом
В принципе понятно только вот мне пришло вголову что то намного полегче:
1) Чтобы была нормаль нужно описать прямоугольник 6-ю вершинами...ИМХО где-то читал что хватает и две вершины знать чтобы определить столкновение(максимальную и минимальную).
2) я собсно с помощью двух вершин и опредиляю столкновение...
3)оказалось все просто:просто надо определить к какой стороне ближе точка и двигать в сторону нормали этой точку(опять же нормали писать не надо ет я так к слову)...
4)А с поворотом просто считать син и кос максимальной или минимальной точки к центру бокса чтобы двигать точку от бокса относительно локальных координат...
Где-то так
|
(Offline)
|
|
05.09.2011, 23:09
|
#4
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Столкновение с боксом
нормаль(x1,y1,z1);
скорость(x2,y2,z2);
проекция скорости на нормаль:
l=(x1*x2+y1*y2+z1*z2)/sqrt(x1*x1+y1*y1+z1*z1)
остаток скорости(x2-x1*l;y2-y1*l;z2-z1*l). Как-то так. мог с направлением вектора остатка скорости ошибится
|
(Offline)
|
|
06.09.2011, 16:53
|
#5
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Столкновение с боксом
Сообщение от Mind
В принципе понятно только вот мне пришло вголову что то намного полегче:
1) Чтобы была нормаль нужно описать прямоугольник 6-ю вершинами...ИМХО где-то читал что хватает и две вершины знать чтобы определить столкновение(максимальную и минимальную).
2) я собсно с помощью двух вершин и опредиляю столкновение...
|
плоскость a*x+b*y+c*y+d=0
нормаль этой плоскости (a,b,c). Кстати как прямоугольник вроде имеющий всего 4(четыре) угла описать шестью точками?O_o Що за вуду?
|
(Offline)
|
|
10.09.2011, 15:07
|
#6
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: Столкновение с боксом
Как можно определить столкновение с повернутым (ну например по оси Y) боксом?
Был вариант преобразовать координаты камеры в объекта чтобы потом:
Если камера.х<объект.х то столкновение
Но не пойму как преобразовать?
Или есть другие способы определения столкновения с повёрнутым объектом?
|
(Offline)
|
|
10.09.2011, 16:10
|
#7
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Столкновение с боксом
правильный способ выучить до понимания це: http://compgraph.tpu.ru/3d.htm
Не правильный, но легкий для восприятия способ это три раза повернуть вокруг осей каждый раз умножая на соответсвующий масштаб вдоль соответствующей оси. Т.е. исходный икс*масштаб по икс=Х в формуле.
Хнов=Х*кос(угла)+У*син(угла вокруг зед)
Унов=-Х*син(угла вокруг зед)+У*косинус(угол вокруг зед)
Ну а смещение потом просто добавляешь к коодинате каждой точки.
И чую я, что это вольный пересказ того что в ссылке. Сильно порядок косинусов в моей формуле похож на порядок в матрице поворота, однака.
|
(Offline)
|
|
10.09.2011, 16:56
|
#8
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Столкновение с боксом
Плоскость берешь от бокса, от модели выбираешь самые "широкие" пары точек и проверяешь с одной стороны плоскости эти точки или нет, если по разные, то пересеклись, если одна из точек лежит в плоскости то коснулись
Если есть пересечение то уже можно подробней смотреть где конкретно для всех точек модели проверяя.
Ну и можно сначала по радиусам узнать, рядом вообще бокс и модель или нет.
|
(Offline)
|
|
10.09.2011, 17:02
|
#9
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: Столкновение с боксом
Блин все что выше я знаю ну кроме матриц их не сильно, но хотя чуть лучше чем с начала! Поворот каждой точки делаю легко вот токо как проверку сделать столкновения?
Приведу пример:
......................Y......................
......................|......................
......................|......................
......................|......................
......................|......................
......................|......................
____________________________X
......................|......................
......................|......................
A___________________________B
......................|......................
......................|......................
Есть отрезок AB. Столкновение здесь определяю я так:
if (camera.y>AB.y) {coll=1;}
if (coll==1) {TranslateEntity(camera.y,0,-1,0)};
А если отрезок не прямой как определить столк.. а?
......................Y......................
......................|......................
......................|......................
......................|......................
......................|......................
......................|......................
_____________________________X
......................|......................
......................|......................
......................|...B..................
......................|../...................
......................|./....................
......................./.....................
....................../......................
...................../|......................
..................A/.|......................
......................|......................
|
(Offline)
|
|
10.09.2011, 17:31
|
#10
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Столкновение с боксом
Открой чтоли аналитическую геометрию на плоскости или в пространстве и выбери способ по вкусу.
|
(Offline)
|
|
10.09.2011, 17:54
|
#11
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: Столкновение с боксом
Я скорее сам додумаюсь с помощью эксперементов чем буду искать что-то.
ЗЫ тем более у меня уже что-то есть на уме щас буду експерементировать..
|
(Offline)
|
|
10.09.2011, 18:09
|
#12
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Столкновение с боксом
Видимо у тебя повышенный уровень мидихлориан
|
(Offline)
|
|
10.09.2011, 18:14
|
#13
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: Столкновение с боксом
походу
|
(Offline)
|
|
10.09.2011, 18:45
|
#14
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: Столкновение с боксом
Как можно повернуть систему координат камеры, чтобы не мучаться с кос и син углов для опр. столкновения с кривой?
Я хочу чтобы когда объект повёрнут на @град. то камеру тоже повернуть на стоко же и опредилять от неё:
if (camera.y>AB.y) {coll=1;}
if (coll==1) {TranslateEntity(camera.y,0,-1,0)};
А потом вернут назад сиситему координат.
PS. Что значит команда D3DXVec3TransformCoord()?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:25.
|