Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top