1

我需要视图来显示道路多边形(矩形 3.f * 100.f),道路的消失点位于视口的 3/4 高度,最近的道路边缘作为视口的底侧。请参阅Crazy Taxi 游戏,了解我想做的一个例子。

我正在使用 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);

常量浮点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 找到正确的参数。我的消失点总是在屏幕的中心。

4

1 回答 1

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,您现在将看到路面下方的一个点。

我敢肯定还有无数其他方法可以做到这一点,但应该可以...

于 2009-12-08T16:18:32.870 回答