OpenGL абсолютные координаты - PullRequest
       15

OpenGL абсолютные координаты

0 голосов
/ 16 сентября 2009

Я очень новичок в создании игр (и работе в OpenGL в целом). Я пытаюсь сделать 2D-игру, но наткнулся на камень преткновения, когда пытаюсь разобраться в обнаружении столкновений.

Допустим, например, что я перевожу текущую матрицу, поверну и снова переведу, а затем нарисую точку. Как мне узнать, где находится эта точка относительно всего, что я мог нарисовать?

Есть ли способ вычисления "абсолютных" координат из текущей матрицы?

Пожалуйста, объясните как можно проще! спасибо:)

Ответы [ 6 ]

3 голосов
/ 18 сентября 2009

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

Вместо этого вам следует поддерживать вручную все позиции вашего объекта (и ориентации, скорости и т. Д.). Все перемещения объектов должны выполняться вами в коде приложения. Когда приходит время рендеринга объектов, вы читаете их текущие значения и передаете их в OpenGL. Обычно вы берете данные многоугольника для каждого объекта типа, который хотите визуализировать, поворачиваете его по ориентации экземпляра объекта, переводите его по положению и затем визуализируете. Повторите один раз за кадр.

Если вы вообще знакомы с парадигмой Model-View-Controller , то ваши игровые объекты - это Модель, а OpenGL предоставляет View. Таким образом, вы должны манипулировать вашей моделью по мере необходимости и просто читать представление из нее, когда это необходимо.

2 голосов
/ 16 сентября 2009

Лучше всего просто отслеживать абсолютную позицию каждого объекта.

1 голос
/ 18 сентября 2009

Разочаровывает, не так ли? У всех начинающих разработчиков OpenGL и графического программирования есть вопросы, похожие на ваши. Отслеживание различных ориентиров может быть непростым делом.

Первое, что я бы порекомендовал, - это получить копию OpenGL SuperBible от Amazon или другого продавца. Он начинается в абсолютном начале и постепенно строится оттуда. Более ранний автор, который рекомендовал сайт NeHe, также дает хороший совет.

Что касается самого вопроса, когда вы создаете программу OpenGL, вы можете установить матрицу "view view" в качестве идентификатора (см. SuperBible для получения дополнительной информации), и все координаты, которые вы задали в вызовах glPoint (), будут определены относительно эта матрица в качестве системы отсчета. Если вы ничего не сделаете, кроме вызова glPoint (), все ваши объекты будут находиться в одной и той же абсолютной системе координат.

Это становится сложно, когда вы начинаете вызывать glTranslate, glRotate и glLoadMatrix, поскольку эти функции преобразуют систему отсчета. Когда это происходит, все последующие вызовы glPoint () относятся к этой новой системе координат.

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

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

Как я уже сказал, сложно описать это правильно в Интернете. Возьмите книгу SuperBible, и она станет намного понятнее. Удачи!

0 голосов
/ 18 сентября 2009

Отслеживайте положение объектов в мировых координатах и ​​сравнивайте их напрямую.

Для отображения используйте модель камеры и примените к ней все ваши преобразования.

0 голосов
/ 16 сентября 2009

Что вы подразумеваете под «абсолютом»?

Если вы хотите, чтобы ваша точка относилась к предыдущим точкам, вы можете отменить только что сделанные преобразования: перевести отрицательный результат второго перевода, повернуть в противоположном направлении вокруг той же оси на ту же величину, а затем перевести отрицательным первого перевода. Это даст вам преобразование из ваших новых координат в старую систему.

В качестве альтернативы вы можете использовать преобразование, которое вам уже нужно, чтобы перенести ваши старые точки в новую систему координат.

0 голосов
/ 16 сентября 2009

Когда я изучил OpenGL, я использовал следующие 2 ресурса для всего.

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

Тем не менее, NeHe по-прежнему являются бесплатными учебными пособиями в Интернете, включая это руководство по обнаружению столкновений .

http://www.gamedev.net/reference/list.asp?categoryid=31

...