forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Столкновение с боксом (http://forum.boolean.name/showthread.php?t=15432)

Mind 05.09.2011 22:24

Столкновение с боксом
 
Получилось определить столкновение с боксом но не пойму как сделать реальное скольжение по его сторонам :4to:
ЗЫ раньше делал столкновение со сферой там куда проше(с помощью синуса и косинуса по трём осям), а как с боксом быть незнаю :dontknow:

dsd 05.09.2011 22:54

Ответ: Столкновение с боксом
 
Если правильно понял:

У тебя есть вектор скорости. есть точка столкновения. есть нормаль поверхности с которой произошел контакт.

Проецируешь на нормаль вектор скорости. вычитаешь из вектора скорости вектор нормали умноженный на длину проекции. Это будет остаток скорости вдоль поверхности с которой произошло столкновение.

Mind 05.09.2011 23:01

Ответ: Столкновение с боксом
 
В принципе понятно только вот мне пришло вголову что то намного полегче:
1) Чтобы была нормаль нужно описать прямоугольник 6-ю вершинами...ИМХО где-то читал что хватает и две вершины знать чтобы определить столкновение(максимальную и минимальную).
2) я собсно с помощью двух вершин и опредиляю столкновение...
3)оказалось все просто:просто надо определить к какой стороне ближе точка и двигать в сторону нормали этой точку(опять же нормали писать не надо ет я так к слову)...
4)А с поворотом просто считать син и кос максимальной или минимальной точки к центру бокса чтобы двигать точку от бокса относительно локальных координат...
Где-то так :)

dsd 05.09.2011 23:09

Ответ: Столкновение с боксом
 
нормаль(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). Как-то так. мог с направлением вектора остатка скорости ошибится

dsd 06.09.2011 16:53

Ответ: Столкновение с боксом
 
Цитата:

Сообщение от Mind (Сообщение 201407)
В принципе понятно только вот мне пришло вголову что то намного полегче:
1) Чтобы была нормаль нужно описать прямоугольник 6-ю вершинами...ИМХО где-то читал что хватает и две вершины знать чтобы определить столкновение(максимальную и минимальную).
2) я собсно с помощью двух вершин и опредиляю столкновение...

плоскость a*x+b*y+c*y+d=0
нормаль этой плоскости (a,b,c). Кстати как прямоугольник вроде имеющий всего 4(четыре) угла описать шестью точками?O_o Що за вуду?

Mind 10.09.2011 15:07

Ответ: Столкновение с боксом
 
Как можно определить столкновение с повернутым (ну например по оси Y) боксом?
Был вариант преобразовать координаты камеры в объекта чтобы потом:
Если камера.х<объект.х то столкновение
Но не пойму как преобразовать?

Или есть другие способы определения столкновения с повёрнутым объектом?

dsd 10.09.2011 16:10

Ответ: Столкновение с боксом
 
правильный способ выучить до понимания це: http://compgraph.tpu.ru/3d.htm

Не правильный, но легкий для восприятия способ это три раза повернуть вокруг осей каждый раз умножая на соответсвующий масштаб вдоль соответствующей оси. Т.е. исходный икс*масштаб по икс=Х в формуле.

Хнов=Х*кос(угла)+У*син(угла вокруг зед)
Унов=-Х*син(угла вокруг зед)+У*косинус(угол вокруг зед)

Ну а смещение потом просто добавляешь к коодинате каждой точки.
И чую я, что это вольный пересказ того что в ссылке. Сильно порядок косинусов в моей формуле похож на порядок в матрице поворота, однака.

dsd 10.09.2011 16:56

Ответ: Столкновение с боксом
 

Плоскость берешь от бокса, от модели выбираешь самые "широкие" пары точек и проверяешь с одной стороны плоскости эти точки или нет, если по разные, то пересеклись, если одна из точек лежит в плоскости то коснулись :)
Если есть пересечение то уже можно подробней смотреть где конкретно для всех точек модели проверяя.

Ну и можно сначала по радиусам узнать, рядом вообще бокс и модель или нет.

Mind 10.09.2011 17:02

Ответ: Столкновение с боксом
 
Блин все что выше я знаю ну кроме матриц их не сильно, но хотя чуть лучше чем с начала! Поворот каждой точки делаю легко вот токо как проверку сделать столкновения?
Приведу пример:
......................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/.|......................
......................|......................

dsd 10.09.2011 17:31

Ответ: Столкновение с боксом
 
Открой чтоли аналитическую геометрию на плоскости или в пространстве и выбери способ по вкусу.

Mind 10.09.2011 17:54

Ответ: Столкновение с боксом
 
Я скорее сам додумаюсь с помощью эксперементов чем буду искать что-то.
ЗЫ тем более у меня уже что-то есть на уме щас буду експерементировать..

dsd 10.09.2011 18:09

Ответ: Столкновение с боксом
 
Видимо у тебя повышенный уровень мидихлориан :-D

Mind 10.09.2011 18:14

Ответ: Столкновение с боксом
 
походу :)

Mind 10.09.2011 18:45

Ответ: Столкновение с боксом
 
Как можно повернуть систему координат камеры, чтобы не мучаться с кос и син углов для опр. столкновения с кривой?
Я хочу чтобы когда объект повёрнут на @град. то камеру тоже повернуть на стоко же и опредилять от неё:

Код:

if (camera.y>AB.y) {coll=1;}
if (coll==1) {TranslateEntity(camera.y,0,-1,0)};

А потом вернут назад сиситему координат.
PS. Что значит команда D3DXVec3TransformCoord()?


Часовой пояс GMT +4, время: 10:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot