Вычисление AABB столкновения - PullRequest
2 голосов
/ 07 декабря 2011

Я делаю игру в OpenGL. Игра состоит в том, что самолет свободно летит в трехмерном мире, который должен пройти через определенные области, например, если бы он проходил через окна. Прямо сейчас я пытаюсь вычислить столкновение самолета с упомянутыми "окнами". В качестве первого подхода я подумал о том, чтобы иметь развернутую AABB для траектории плоскости и несколько AABB для каждого окна, например, если эти AABB перекрываются, существуют потенциальные случаи прохождения плоскости через нее. Но проблема начинается, когда я пытаюсь вычислить AABB, поскольку каждый известный мне алгоритм должен знать координаты обоих объектов (плоскость + окно) в одной и той же системе отсчета. Моя программа рисует мир так, как будто он движется, а не плоскость, которая всегда центрирована в начале координат (на самом деле, при z = -10, поэтому он отображается). Реальная проблема заключается в том, как вычислить координаты каждого "окна", если смотреть с плоскости. Вот код, который я использую для рисования сцены:

glLoadIdentity();

//these are the rotations of the plane of the ground
glRotatef(RotHorizont, 0.0f, 0.0f, 1.0f);
glRotatef(-directionX, 1.0f, 0.0f, 0.0f);
glRotatef(-directionY, 0, 1.0f, 0);

//and these are the movement of the plane
//(the multiplication by 0.0174532925f is to convert the angles to radians
Tx -= (float)Math.sin(directionY * 0.0174532925f) * velocity;
Tz -= (float)Math.cos(directionY * 0.0174532925f) * velocity;
Ty -= (float)Math.sin(directionX * 0.0174532925f) * velocity;

glTranslatef(-Tx, Ty, -Tz);

/*
here I draw the ground and the windows
*/
....

//and now I draw the plane
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -10.0f);
/* draw the plane */

Итак, как, черт возьми, я могу получить координаты "окон"? Или есть какой-то другой способ вычисления столкновения? Мне очень нужна ваша помощь, я буду очень благодарен. Спасибо всем!

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011

Это действительно хорошая книга на эту тему: http://realtimecollisiondetection.net/

Кроме того, на этом сайте также есть хорошая коллекция методов для расчета столкновений между различными типами: http://www.realtimerendering.com/intersections.html

2 голосов
/ 07 декабря 2011

Вы можете определить AABB по позиции (3-координатный вектор) и ее размеру (3-координатный вектор), а также применить любой алгоритм обнаружения столкновений AABB для решения вашей проблемы.

Как вы указали, вычисления должны выполняться в одной и той же системе координат. Однако, поскольку вы имеете дело с AABB (а не с OBB), вам не нужно иметь дело с ориентацией (либо AABB вычисляется так, что объект останется в нем после поворота, либо вы пересчитываете его после каждого поворота объекта). Поскольку «AA» означает «Выровненный по оси», вы обычно уже имеете дело с общей системой отсчета (иначе это были бы OBB). Таким образом, единственное «преобразование», которое может потребоваться, - это перевод.

Если центр вашей плоскости является центром вашей системы координат, позиция AABB вашей плоскости будет (0,0,0) (или (0,0, -10)). Для ваших окон, в общем, это зависит от того, как вы их определяете, но найти их центры должно быть довольно легко (с OpenGL вы имеете дело с продуктами матриц преобразования , найдите те, которые берут вас из исходной координаты Система для Windows одна). Если вы предоставите больше информации, мы могли бы дать вам более подробную информацию о том, как этого добиться.

Ссылки:

...