Я пытаюсь создать 2D-камеру в стиле сверху вниз в OpenGL. Я хотел бы придерживаться соглашения об использовании матриц модель-вид-проекция, чтобы я мог переключаться между 3D-видом и видом сверху вниз во время работы приложения. На самом деле я использую метод glm :: lookAt для создания матрицы просмотра.
Однако в моем понимании чего-то не хватает. Я визуализирую треугольник на экране [очень близко к этому руководству] [1], и он работает отлично (так что никаких проблем с управлением окнами, циклами отображения, буферами вершин и т. Д.). Треугольник с центром в (0, 0), а вершины на -0,5 / 0,5 (так уже в NDC).
Затем я добавил uniform mat4 mpv;
в вершинный шейдер. Если я установил матрицу mpv на:
glm::vec3 camera_pos = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 target_pos = glm::vec3(0.0f, 0.0f, 0.0f);
glm::mat4 view = glm::lookAt(camera_pos, target_pos, glm::vec3(0.0f, 1.0f, 0.0f));
Я получаю тот же немодифицированный треугольник, как и ожидалось, поскольку это (насколько я понимаю) значения по умолчанию для OpenGL.
Теперь я подумал, что если я изменю значение Z положения камеры, это будет иметь тот же эффект, что и увеличение и уменьшение масштаба, однако все, что я получаю, это чистый цвет, треугольник не отображается.
// Trying to simulate zoom in and out by changing z value of camera
glm::vec3 camera_pos = glm::vec3(0.0f, 0.0f, -3.0f);
glm::vec3 target_pos = glm::vec3(0.0f, 0.0f, 0.0f);
glm::mat4 view = glm::lookAt(camera_pos, target_pos, glm::vec3(0.0f, 1.0f, 0.0f));
Итак, я распечатал матрицу вида и заметил, что все, что я делал, это переводил значение Z, что имеет смысл.
Затем я добавил матрицу орто-проекции, чтобы убедиться, что все в NDC, но я все равно ничего не получил.
// *2 cause im on a Mac/high-res screen and the frame buffer scale is 2.
// Doing projection * view in one step and just updating view uniform until I get it working.
view = glm::ortho(0.0f, 800.0f * 2, 0.0f, 600.0f * 2, 0.1f, 100.0f) * view;
Где происходит мое недоразумение. Я хотел бы:
- Смоделируйте вид сверху вниз, где я могу увеличивать и уменьшать масштаб цели.
- Создайте 2D-камеру, которая следует за целью (гоночной машиной), поэтому camera_pos XY и target_pos XY будут одинаковыми.
- В конце концов, добавьте возможность переключения на 3D-камеру слежения, как в стандартной гоночной игре с видом от третьего лица, следовательно, MPV вместо простого перевода. [1]: https://learnopengl.com/Getting-started/Hello-Triangle