Как преобразовать 2D-мир в координаты экрана OpenGL

В настоящее время я работаю над реализацией рендеринга с поддержкой OpenGL в 2D игровом движке.

Поскольку пространство координат экрана OpenGL равно [-1,1], я немного смущен относительно того, как он должен быть сопряжен с общей, картезианской 2D системой координат мира.

Предположим, что в моем мире есть [-500, -500] до [1200, 1200], где [0, 0] - мировое происхождение. Нужно ли мне только переводить и масштабировать до координат между -1 и 1? Или есть какая-то другая форма преобразования, которая должна быть выполнена?

Как вы вычисляете, где рисовать объекты на экране, которые имеют определенные позиции в вашей собственной системе координат?

Я был бы признателен за объяснение с и без glOrtho (поэтому мы можем использовать ось Z также для перспективных эффектов).

Ответы

Ответ 1

Во-первых, OpenGL использует несколько систем координат, поэтому нет " системы координат OpenGL". Вы имеете в виду нормализованные координаты устройства (NDC), где все три координаты находятся в диапазоне [-1, 1]. Различные системы координат и их имена объясняются здесь, в разделе "9.011 Как преобразуются координаты? Каковы разные координатные пространства?". 1)

Во-вторых, во избежание путаницы в OpenGL термин "видовой экран" относится к той части окна, в которую вы рендерируете, и в координатах окна. В вашем вопросе вы использовали его для описания части (l, r, t, b) = (- 500, -500, 1200, 1200) вашего мира, которую вы хотите отобразить, которая находится в мировых координатах.

Вы спросили, как "рассчитать, где рисовать объекты на экране". То, что вам нужно сделать, это определить трансформацию (матрицу 4x4), которая отображает из одной системы координат в другую. Ваш 2D-мир задан в мировых координатах, поэтому вам нужно определить матрицу, которая преобразует мировые координаты в НДЦ, т.е. Матрицу проекций. В ваших шейдерах вы просто просто умножаете свои вершины на эту матрицу проекций, и вы получаете НДЦ. glm::ortho/glOrtho вычисляет такую ​​проекционную матрицу. Что касается перспективной проекции, то не понятно, что вы хотите сделать, но вы должны поэкспериментировать с функциями perspective и lookat в glm.

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

Также обратите внимание, что вы указали квадрат, и обычно это не то, что вы хотите. Мониторы и большинство окон не квадратные, поэтому, если вы сопоставляете этот квадрат с типичным окном просмотра, вы получите искаженное представление о своем мире. Вам нужно учитывать соотношение сторон (ширина: высота) окна просмотра. Я попытался объяснить, что здесь.


1) В качестве побочного примечания часто задаваемые вопросы относятся к старым версиям OpenGL. В настоящее время программисты ожидаются и призваны управлять как самими моделью, так и проекционными матрицами, поскольку они нужны вам в ваших шейдерах. Я настоятельно рекомендую glm, поэтому он просто загорается, поэтому очень легко интегрируется и имеет хороший синтаксис, который отражает GLSL.

Ответ 2

Используйте glOrtho на матрице проекции, а затем рисуйте нормально. Для вашего примера, я предполагаю, что вы хотите glOrtho (0, 1000, 0, 3000, -1, 1), который даст вам видовое окно 1000 единиц по ширине и 3000 единиц в высоту.

Ответ 3

Поместите свою сцену в любую систему координат, которую вы хотите. Я рекомендую использовать glm (http://glm.g-truc.net/) для инициализации матриц и выполнения математических операций и т.д. Таким образом, у вас, вероятно, есть движок графика сцены, где вы управляете все объекты в вашем 2D/3D мире. Просто настройте представление и проекцию правильно в glm. Фактически, вам не нужны никакие детали реализации графического конвейера, поэтому в вашем игровом движке может быть плохое дизайнерское решение.