Создание камеры 2D-вида OpenGL, но с использованием камер проекции вида модели

Я пытаюсь создать 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;

Где происходит мое недоразумение. Я хотел бы:

  1. Смоделируйте вид сверху вниз, где я могу увеличивать и уменьшать масштаб цели.
  2. Создайте 2D-камеру, которая следует за целью (гоночной машиной), поэтому camera_pos XY и target_pos XY будут одинаковыми.
  3. В конце концов, добавьте возможность переключения на 3D-камеру слежения, как в стандартной гоночной игре с видом от третьего лица, следовательно, MPV вместо простого перевода. [1]: https://learnopengl.com/Getting-started/Hello-Triangle

person user2840470    schedule 08.01.2021    source источник
comment
Преобразование вершин (по матрице) применяется при отрисовке материала. Если вы хотите, вы можете дать каждому треугольнику в одном кадре свой собственный набор матриц преобразования. Возможность переключения трансформаций полностью не зависит от того, как вы строите свой конвейер трансформации.   -  person datenwolf    schedule 08.01.2021


Ответы (1)


Координаты вершин находятся в диапазоне [-0,5, 0,5], но ортогональная проекция проецирует кубоидный объем с левой, нижней, ближней точкой _ (0, 0, 0,1) и правой, верхней и дальней точкой ( 800,0 * 2, 600,0 * 2, 100) области просмотра.
Следовательно, треугольная сетка покрывает только один фрагмент в нижнем левом углу области просмотра.

Измените орфографическую проекцию:

view = glm::ortho(0.0f, 800.0f * 2, 0.0f, 600.0f * 2, 0.1f, 100.0f) * view;

view = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, 0.1f, 100.0f) * view;
person Rabbid76    schedule 08.01.2021