OpenGL 正交投影

OpenGL Orthographical Projection

我一直在玩OpenGL和矩阵运算,我理解P * V * M的概念,但我不明白为什么改变'camera'的Z位置没有缩放的效果。

使用透视投影时,改变相机的 Z 轴会产生缩放效果(如我所料)。

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
glm::mat4 View       = glm::lookAt(
                            glm::vec3(0,0,3), // changing 3 to 8 will zoom out
                            glm::vec3(0,0,0),
                            glm::vec3(0,1,0)
                       );
glm::mat4 Model      = glm::mat4(1.0f);
gml::mat4 MVP        = Projection * View * Model;

然而,当我使用正射投影时,将 3 更改为 8 或任何它没有缩小的效果。我知道它们是非常不同的预测,但我正在寻找一个解释(为什么它不起作用背后的数学会特别有帮助)。

glm::mat4 Projection = glm::ortho(
    0.0f,
    128.0f,
    0.0f,
    72.0f,
    0.0f,
    100.0f
);

当您将 Z 坐标从 3 更改为 8 时,实际上并没有缩小,您只是将相机移得更远。您可以通过更改 glm::perspective.

的第一个参数来缩小而不移动相机

正交相机没有位置(您可以将其视为无限远),因此无法以相同的方式"move"正交相机。您可以通过更改传递给 glm::ortho 的边界来缩小。只需将更大的数字传递给 glm::ortho.

这就是正交投影的工作原理。让我们从透视变换开始:

你沿着一条直线到相机得到一个物体的投影:

如果你把相机移近一点,你会看到投影面积增加了:

正交投影的工作方式不同。您可以通过垂直于图像平面的直线获得投影:

而且很明显,投影区域的大小并不取决于相机离物体的距离。那是因为投影线总是平行的,并且在图像平面的两个方向上保持物体的大小。

看看移动透视相机时会发生什么:

此处:(xe, ye, ze) - 眼睛坐标系中的点。 (xp, yp, zp) - 该点的投影 n - 到近平面的距离 t - 到平截头体顶平面的距离

你可以看到,当你靠近相机时,xp 和 yp 会增长。

相比之下,改变正交相机的z位置不会影响xp和yp,但仍然会影响zp,因此会改变深度缓冲区中的值。