gpt4 book ai didi

c++ - glOrtho 制作顶 View 的正确参数是什么?

转载 作者:行者123 更新时间:2023-11-30 00:59:13 24 4
gpt4 key购买 nike

我尝试通过使用 Visual C++ 创建某种 3D 建模器应用程序来学习 OpenGL。屏幕将分为三个窗口:透视、正面和顶部(等距)。而且我几乎放弃尝试实现顶 View 。这是我当前的顶 View 代码:


glOrtho(-1,1,-1,1,1,3.5f);
gluLookAt(
0,2,0,//eye
0,0,0,//center
0,0,-1);//up

但是如果我把物体移到远处的Z,它肯定会消失。如何让顶 View 能够看到场景中的所有对象???

如何计算 glOrtho 和 glLookAt 所需的参数?

最佳答案

您不应使用 gluLookAt(请注意“glu”中的“u”,gluLookAt 不是 OpenGL 的一部分),而应直接设置模型 View 矩阵。首先,您必须定义怎么了向上、远处和侧面。大多数使用 OpenGL 的人更喜欢右手坐标系 (RHCS)。第一个碱基是 X,第二个是 Y,第三个是 Z。在 RHCS 中,X 位于侧面(向右),Y 位于远方,Z 位于上方。 OpenGL 的默认投影是,就好像相机在负方向上向下看 Z 轴,即向下看。

所以我们可以说矩阵

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

低着头。望向远方,你必须偏航。 X保持不变,但交换了Y和Z。对应的矩阵是

1 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1

从侧面看,全局 Y 映射到 View X,全局 X 映射到 Z,全局 Z 映射到 Y,结果是

0 1 0 0
0 0 1 0
1 0 0 0
0 0 0 1

现在您可能想要平移和缩放该 View 。您可以使用 glScale 和 glTranslate 或直接在矩阵中执行此操作。

s 0 0 pan.x
0 s 0 pan.y
0 0 s pan.z
0 0 0 1

s 0 0 pan.x
0 0 s pan.y
0 s 0 pan.z
0 0 0 1

0 s 0 pan.x
0 0 s pan.y
s 0 0 pan.z
0 0 0 1

现在,在 Z 方向平移在正交投影中意义不大。所以你可以让 pan.z 为零。

现在让我们解决您的深度裁剪问题。正交投影的一个很好的特性是,深度裁剪范围将线性映射到深度缓冲区中,而在透视投影中它遵循 1/x 定律。远近距离的混合符号也是完全允许的,并且也没有限制 |near| < |远|。因此,对于您的每个 View ,您所要做的就是确定所有对象的变换顶点的最小和最大位置,并使用它们在每个 View 的投影中设置适当的裁剪值。一个很好的近似值,这样您就不必遍历每个顶点使用对象边界球体和位置(将边界球体半径添加/减去它的位置)来获得最小/最大范围。

关于c++ - glOrtho 制作顶 View 的正确参数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com