Обнаружение столкновений OpenGL - PullRequest
2 голосов
/ 03 мая 2009

В настоящее время я работаю над созданием моей первой игры FPS с использованием JOGL. (Java-привязки для OpenGL).

До сих пор мне удавалось генерировать «мир» (серию кубов) и модель игрока. У меня обнаружение столкновений между игроком и кубами работает отлично.

Теперь я пытаюсь добавить оружие. Я правильно нарисовал модели оружия и загружаю их на модель игрока. Первый пистолет, который я пытаюсь реализовать, - это лазерный пистолет, который стреляет и мгновенный лазер прямой видимости во все, к чему вы стремитесь. Прежде чем приступить к реализации моделей противника, я бы хотел, чтобы обнаружение столкновений между лазером и работающими стенами.

Мой лазер, в настоящее время, нарисован рядом маленьких кубиков, один за другим. Первый куб вытягивается в конце оружия игроков, затем он непрерывно вытягивает оттуда. Идея состояла в том, чтобы продолжать рисовать кубы лазера, пока не будет обнаружено столкновение с чем-то, а именно с кубами в мире.

Я знаю расположение кубиков в мире. Проблема в том, что мне нужно вызвать glMatrixPush, чтобы нарисовать мою модель персонажа. Лазер затем рисуется в рамках этой модели. Это означает, что я потерял свою старую систему координат - поэтому я рисую мир в одной системе, а затем лазер в другой. В этой матрице игроков я несколько раз вызывал glRotate и glTranslate, чтобы синхронизировать все с тем, как вращается камера. Лазер затем строится путем перемещения вдоль оси Z этой новой системы.

Моя проблема заключается в том, что после всех этих преобразований у меня больше нет представления о том, где находится мой лазер в системе координат карты, в первую очередь из-за поворотов камеры.

Кто-нибудь знает метод - или есть идеи, как решить эту проблему? Я считаю, что мне нужен способ конвертировать новые координаты лазера в старые координаты карты, но я не уверен, что делать, чтобы отменить все преобразования, которые были сделаны с ним. Также может быть некоторая функциональность, предоставляемая OpenGL для решения такого рода проблем, о которых я просто не знаю.

Ответы [ 2 ]

4 голосов
/ 03 мая 2009

Вы не должны рассматривать лазер как пространственное дитя персонажа, который его запускает. После того, как он был запущен, лазер стал отдельной сущностью, поэтому вы должны сделать следующее:

glPushMatrix(viewMatrix);
glPushMatrix(playerMatrix);
DrawPlayer();
glPopMatrix();
glPushMatrix(laserMatrix);
DrawLaser();
glPopMatrix();
glPopMatrix();

Также убедитесь, что вы не смешиваете логику преобразования рендеринга с игровой логикой. Вы всегда должны хранить положение ваших объектов в мировом пространстве, чтобы иметь возможность проверять пересечения независимо от вашего текущего стека матрицы OpenGL.

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

3 голосов
/ 05 мая 2009

Смысл первого ответа в том, что вы никогда не должны полагаться на матрицу для позиционирования объекта на первом месте. Вы должны следить за положением и вращением лазера, прежде чем даже думать о его рисовании. Затем вы используете команды перевода и вращения, чтобы поместить его туда, где, как вы знаете, должно быть.

Вы пытаетесь делать вещи задом наперед, и да, это означает, что вам придется выполнять математику, а OpenGL этого не отслеживает, потому что матрица ModelView - это ЕДИНСТВЕННАЯ вещь, которую OpenGL отслеживает. в отношении позиции объектов. OpenGL не имеет понятия «мировое пространство» или «пространство камеры». Существует только матрица, на которую умножается весь ввод. Это элегантно просто ... но в некоторых случаях я предпочитаю, чтобы DirectX имел отдельную матрицу представления и матрицу модели.

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

(в значительной степени то, что говорит первый ответ, просто по-другому ...)

...