【问题标题】:Switching from perspective orthographic projection in OpenGL在 OpenGL 中从透视正交投影切换
【发布时间】:2015-08-25 02:35:55
【问题描述】:

我真的是 OpenGL 的新手,并试图从“现代”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 接近于零。

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

【问题讨论】:

    标签: c# opengl opentk


    【解决方案1】:

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

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

    • 透视投影给出了适当的 到地板的深度,以便可以看到;当物体离你更近时,它们看起来更大。但是正交投影不会根据它们的深度改变它们的大小。而且,地板在正射投影中“消失”的原因是地板 是“无限薄”并且水平方向。
    • 您的正交投影调整屏幕大小,使窗口空间中的一个像素 对应于对象空间中的 1 个单位。由于环(看起来)大小约为 12 个单位,因此它们在屏幕上看起来相当小。一种解决方案可能是在CreateOrthographic 中使用较小的尺寸。但这并不能解决所有问题;例如,地板仍将保持“不可见”。

    另请注意:

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

    【讨论】:

    • 地板消失没问题,我的主要问题是在透视投影的相同相机位置的情况下物体的大小。我错过了正交投影中“1 个单位 = 1 个像素”的部分。有了新值,投影看起来会更好,现在我将尝试正确理解它,以便可以为任何模型计算这些值。谢谢
    猜你喜欢
    • 2016-02-11
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多