问题描述
我正在尝试在 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;
我的误会在哪里。我想:
- 模拟自上而下的视图,我可以在其中放大和缩小目标。
- 创建一个跟随目标(赛车)的 2D 相机,因此 camera_pos XY 和 target_pos XY 将相同。
- 最终添加了一个选项来切换到 3D 跟随相机,就像标准的赛车游戏第三人称视角,因此 MPV 与仅使用简单翻译相比。 [1]:https://learnopengl.com/Getting-started/Hello-Triangle
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)