【发布时间】:2021-01-08 00:35:32
【问题描述】:
我正在尝试在 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, 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
【问题讨论】:
-
在绘制东西时应用顶点变换(按矩阵)。如果您愿意,您可以为单个帧中的每个三角形赋予其自己的一组变换矩阵。 “切换”转换的能力完全独立于您如何布局转换管道。
标签: c++ opengl glm-math orthographic