我尝试使用Visual C ++创建某种3D Modeler应用程序来学习OpenGL。屏幕将分为三个窗口:透视图,正面和顶部(等轴测图)。 而我几乎放弃尝试实现顶视图。这是我目前的顶级视图代码:
glOrtho(-1,1,-1,1,1,3.5f);
gluLookAt(
0,2,0,//eye
0,0,0,//center
0,0,-1);//up
但是,如果我将对象移动到远Z,它肯定会消失。如何使顶视图能够查看场景中的所有对象???
如何计算glOrtho和glLookAt所需的参数?
答案 0 :(得分:4)
你不应该使用gluLookAt(注意'glu'中的'u',gluLookAt不是OpenGL的一部分),而是直接设置modelview矩阵。首先,你必须定义怎么了向上,向远和横向。大多数使用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映射到视图X,全局X映射到Z,全局Z映射到Y,导致
0 1 0 0
0 0 1 0
1 0 0 0
0 0 0 1
现在您可能想要平移和缩放该视图。您可以使用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保留为零。
现在让我们解决您的深度剪裁问题。 othographic投影的一个很好的特性是,深度剪辑范围将被线性地映射到深度缓冲区,而在透视投影中它遵循1 / x定律。远距离和近距离的混合标志也是完全允许的,并且也没有|附近的约束< |远|。因此,对于每个视图,您要做的就是确定所有对象的变换顶点的最小和最大位置,并使用这些位置在每个视图的投影中设置适当的剪辑值。一个很好的近似,这样你就不必迭代每个顶点就是使用边界球体和位置的对象(将边界球半径加到/减去它的位置)来获得最小/最大范围。
答案 1 :(得分:1)
您需要根据几何图形调整z far值。您应该计算模型的边界球或边界框,找到Z范围并根据它调整相机。
答案 2 :(得分:1)
glm(GL数学,http://glm.g-truc.net/)可能是在撰写答案时datenwolf正在寻找的东西。这提供了GLU的设施,但旨在与现代GL一起使用。例如,有一个glm :: ortho函数。例如,这是glm用于使用正交视图计算和设置顶点着色器均匀的模型 - 视图 - 投影矩阵,使用GLM:
glm::mat4 model = ...
glm::mat4 view = ...
glm::mat4 projection = glm::ortho(-xrange, xrange,
-yrange, yrange,
-10.0f, 10.0f);
glm::mat4 mvp = projection * view * model;
glUniformMatrix4fv(uniform_mvp, 1, GL_FALSE, glm::value_ptr(mvp));