OpenGL正交相机缩放无法正常工作

Posted

技术标签:

【中文标题】OpenGL正交相机缩放无法正常工作【英文标题】:OpenGL orthographic camera zooming not working properly 【发布时间】:2019-10-21 16:13:57 【问题描述】:

我已经为我的场景实现了一个小型 2d 相机。问题是,如果我尝试缩放相机,一些如何向左和向下移动而不是放大(每个对象向上和向右移动)。我不确定我做错了什么。

Camera.cpp:

void Camera2D::zoom(float zoomFactor)

    scale = glm::scale(scale, glm::vec3(zoomFactor, zoomFactor, 0));
    updateMatrix();


void Camera2D::updateMatrix()

    translate = glm::translate(glm::mat4(1.f) , glm::vec3(-400, -300, 0));//zoom from center of 
screen
    view = translate * scale;
    translate = glm::translate(glm::mat4(1.f), glm::vec3(0, 0, 0));
    view = translate * scale;

我将 mvp 矩阵发送到着色器,如下所示:投影 * 视图 * 模型。 缩放系数仅为 1.001。

【问题讨论】:

您是否使用左下角为 (0, 0) 右上角为 (800, 600) 的正交投影?视图矩阵是单位矩阵+比例吗? 【参考方案1】:

我假设您使用的是正交投影,左下角是 (0, 0),右上角是 (800, 300)。 所以视图的中心是 (400, 300)。

如果您想围绕正交投影的中心缩放视图,那么您必须:

将中心平移到原点。这意味着平移 (-400, -300)。 缩放(比例) 将原点平移回中心。这是 (400, 300) 的翻译。
void Camera2D::updateMatrix()

    glm::vec3 center(400.0f, 300.0f, 0.0f);
    glm::mat4 view = glm::translate(glm::mat4(1.0f), center) * 
                     scale *
                     glm::translate(glm::mat4(1.0f), -center);

【讨论】:

谢谢!问题是我翻译错了方向

以上是关于OpenGL正交相机缩放无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 进行正交投影以及如何实现相机或物体在空间中的移动

OpenGL - 让相机移动

OpenGL投影缩放

如何在缩放投影矩阵Opengl的同时平移光标位置

OpenGL - 正交投影矩阵,glViewport

openGL - 正交投影矩阵