创建 OpenGL 2D 视图相机但使用模型视图投影相机
Create an OpenGL 2D view camera but using model view projection cameras
我正在尝试在 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
顶点坐标在[-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;
我正在尝试在 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
顶点坐标在[-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;