如何在iPad中设置glFrustumf

时间:2011-07-28 05:52:14

标签: ipad

在这里,我创建了一个简单的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。

1 个答案:

答案 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>