从 OpenGL 中的透视正交投影切换

Switching from perspective orthographic projection in OpenGL

我是 OpenGL 的新手,正在尝试从 'modern' OpenGL 教程中学习。

我正在使用 C# 和 OpenTK。

我正在使用以下代码设置我的 projectionMatrix:

_projectionMatrix = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver3, GetAspectRatio(), 0.1f, 100f);

我设置好之后,上传到着色器,用于转换等。这样一切都很好,如下图所示:

现在如果我这样设置我的投影矩阵,结果会非常糟糕,如下图所示:

_projectionMatrix = Matrix4.CreateOrthographic(GLControl.ClientSize.Width, GLControl.ClientSize.Height, 0.1f, 100f);

不仅新视图很奇怪,而且如果我向前移动场景,对象开始剪裁,甚至znear接近于零。

如何正确设置正交投影,以便获得接近我的透视图的视图?

您似乎无法理解正交投影。

您的场景在正交视图中看起来不正确的原因有多种:

  • 透视投影给出了合适的 地板的深度,以便可以看到;物体离你越近,它们看起来就越大。但是正交投影不会根据它们的深度改变它们的大小。而且,正投影中floor "disappears"的原因是floor "infinitely thin" 水平方向。
  • 您的正交投影会调整屏幕大小,使 window space 中的一个像素 对应于对象 space 中的 1 个单元。由于环的大小(看起来)约为 12 个单位,因此它们在屏幕上看起来相当小。一种解决方案可能是在 CreateOrthographic 中使用较小的尺寸。但这并不能解决所有问题;例如,地板仍将保持 "invisible".

另请注意:

  • 如果使用正交投影,甚至可以为 zNear 使用负值, 但可能不是 0。透视投影不是这种情况。
  • 正交投影可以构成称为 isometric projection 的类 3D 投影的基础。