如何为赛车游戏设置OpenGL摄像头

时间:2009-12-08 15:52:00

标签: iphone opengl-es camera projection

我需要视图显示道路多边形(一个矩形3.f * 100.f),其中道路处于视口的3/4高度,最近的道路边缘作为视口的底部。请参阅Crazy Taxi game以获取我想要做的示例。

我正在使用iPhone SDK 3.1.2默认的OpenGL ES项目模板。

我按如下方式设置投影矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustumf(-2.25f, 2.25f, -1.5f, 1.5f, 0.1f, 1000.0f);

然后我使用glRotatef调整横向模式并设置相机。

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();  glRotatef(-90,0.0f,0.0f,1.0f);

const float cameraAngle = 45.0f * M_PI / 180.0f;  gluLookAt(0.0f,2.0f,0.0f,0.0f,0.0f,100.0f,0.0f,cos(cameraAngle),sin(cameraAngle));

我的道路多边形三角形条是这样的:

static const GLfloat roadVertices[] = {

-1.5f,0.0f,0.0f,    1.5f,0.0f,0.0f,         -1.5f,0.0f,100.0f,          1.5f,0.0f,100.0f,     };

我似乎找不到gluLookAt的正确参数。我的消失点总是在屏幕的中心。

1 个答案:

答案 0 :(得分:2)

你想用真正的3D做到这一点吗?基本上你看点是屏幕的中心。你想要的是屏幕下方四分之一的屏幕。

您可以通过投影和视图反转最终位置(基本上是未投影)来解决问题。

假设屏幕在x中从-1.0f延伸到1.0f,在y中从-1.0f延伸到1.0f,那么你希望地平线到达(0.0f,0.5f)。这意味着您需要向下看屏幕的四分之一(即-0.5f)。对于给定的z(我们将随机选择0.5f)。因此,如果我们按照您已定义的视图和“身份”矩阵以及“投影”矩阵进行查看,则可以通过gluUnproject传递此信息,如下所示:

GLdouble eyeX, eyeY, eyeZ;
gluUnproject( 0.0f, -0.5f, 0.5f, identity, view, projection, &eyeX, &eyeY, &eyeZ );

然后,您可以将眼睛值重新插入gluLookAt,现在您将看到路面下方的一个点。

我确信有无数其他方法可以做到但是应该有效...