从 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 投影的基础。
我是 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 投影的基础。