在这里,我创建了一个简单的OpenGLES iPad样本。
//----------------------------------------
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustumf(-1, 1, -1, 1, 0, 20);
glMatrixMode(GL_MODELVIEW);
static const GLfloat squareVertices[] = {
-0.5f, -0.33f,1.6,
0.5f, -0.33f,1.6,
-0.5f, 0.33f,1.6,
0.5f, 0.33f,1.6
};
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
. . . . . . .
. . . . . . .
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
//----------------------------------------
我在mac示例中使用了gluLookAt,但在iPad中找不到它。上面代码中的基本错误是什么?为什么广场不可见?
如果我在顶点数组中更改z值则工作正常。
static const GLfloat squareVertices[] = {
-0.5f, -0.33f,0.5,
0.5f, -0.33f,0.5,
-0.5f, 0.33f,0.5,
0.5f, 0.33f,0.5
};
我认为z值范围应该是0-20,这里是1.6,它在范围内。我现在不想改变顶点值。帮我设置glFrustumf。
答案 0 :(得分:1)
传递给glFrustum的近端和远端值不是对象空间中的绝对坐标。它们是从相机到近处和远处平面的距离。这意味着你不能说1.6的z坐标必然在你的平截头体中,除非你知道相机位置在哪里以及它指向的方向。
例如,如果您的相机位于(0,0,-19)指向原点并且您将0和20传递给glFrustum接近和远,那么在物体空间中,近平面位于-19(-19 + 0) )和远平面是1(-19 + 20)。在这种情况下,z = 1.6的正方形将越过远平面,但z = 0.5的正方形将位于平截头体内。类似地,如果你的相机在(0,0,1)处具有相同的glFrustum值,那么在物体空间中,近平面将为1,远处将为-19,因此0.5将在,而1.6将在外。 / p>