创建一个 OpenGL 2D 视图相机,但使用模型视图投影相机

问题描述

我正在尝试在 OpenGL 中创建一个 2D、自上而下的风格相机。我想坚持使用模型-视图-投影矩阵的惯例,这样我就可以在应用程序运行时在 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);
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,-3.0f);
    glm::vec3 target_pos = glm::vec3(0.0f,0.0f);
    glm::mat4 view = glm::lookAt(camera_pos,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,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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)