我需要视图显示道路多边形(一个矩形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的正确参数。我的消失点总是在屏幕的中心。
答案 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,现在您将看到路面下方的一个点。
我确信有无数其他方法可以做到但是应该有效...