我正在编写一个使用透视投影的简单程序,我在场景中绘制了一堆对象。对于透视投影,我使用以下代码:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluLookAt(eyePosX, eyePosY, eyePosZ, centerPosX, centerPosY, centerPosZ, 0.0, 1.0, 0.0);
glFrustum(frustumLeft,frustumRight,frustumBottom,frustumTop,frustumNear,frustumFar);
当我在X轴上绘制了一个不在偏头角内的某个偏移的物体时,该物体被拉伸,但是被拉长并且没有被平截头体剔除。 XYZ空间中8个点相对于eyePosX / Y / Z和frustumLeft / Right / Bottom / Top / Near / Far的坐标是多少? 如何告诉OpenGL执行剔除不在平截头体内的对象?
答案 0 :(得分:0)
对于透视投影,我使用以下代码:
有两种可能性。首先,你真的不想做这个代码所做的事情。第二个是你 意味着它,但不完全理解你做了什么。
现在让我们来介绍第一个。观察矩阵永远不应该在内部 GL_PROJECTION
矩阵。此外,观察矩阵总是在投影矩阵之后。这些应该始终为真,除非你正在做一些特殊的事情。
这导致第二个。如果你真的打算旋转和偏移后投影空间,那么你不能指望几何体会被截击到平截头体。为什么呢?
因为OpenGL不做截锥体剔除。它会剔除您提供的任何T& L后顶点位置。如果你在视锥体之外旋转视图,那就是绘制的内容。 OpenGL不会绘制不可见的内容;如果你改变视图后投影,以便现在可以看到不可见的东西,那么你已经改变了什么是不可见的。