沮丧的位置,起源和剔除

时间:2012-03-04 22:32:30

标签: graphics opengl-es opengl-es-2.0

我正在编写一个使用透视投影的简单程序,我在场景中绘制了一堆对象。对于透视投影,我使用以下代码:

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执行剔除不在平截头体内的对象?

1 个答案:

答案 0 :(得分:0)

  

对于透视投影,我使用以下代码:

有两种可能性。首先,你真的不想做这个代码所做的事情。第二个是你 意味着它,但不完全理解你做了什么。

现在让我们来介绍第一个。观察矩阵永远不应该在内部 GL_PROJECTION矩阵。此外,观察矩阵总是在投影矩阵之后。这些应该始终为真,除非你正在做一些特殊的事情。

这导致第二个。如果你真的打算旋转和偏移后投影空间,那么你不能指望几何体会被截击到平截头体。为什么呢?

因为OpenGL不做截锥体剔除。它会剔除您提供的任何T& L后顶点位置。如果你在视锥体之外旋转视图,那就是绘制的内容。 OpenGL不会绘制不可见的内容;如果你改变视图后投影,以便现在可以看到不可见的东西,那么你已经改变了什么是不可见的。