-1

我正在使用 Opengl 中的 Eclipse C++ 创建一个保龄球游戏。

我使用 glutSolidCone() 创建了锥体,使用glutSolidSphere()创建了球

当球的坐标是GLfloat ball[] = {/* X */ 0.0f, /* Y */-2.0f, /* Z */ -6.0f, /*sphere*/ 0.9f, 50.0, 50.0 };

球的代码是glTranslated(ball[0], ball[1], ball[2]);

glutSolidSphere(ball[3], ball[4], ball[5]);看起来像球看起来不错

但是当我将球的 X 轴更改为GLfloat ball[] = {/* X */ -5.0f, /* Y */ -2.0f, /* Z */ -6.0f, /*sphere*/ 0.9f, 50.0, 50.0 };它看起来像表现不佳

我的glutReshapeFunc()代码如下: -

static void resize(int width, int height) {
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 1.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

为什么当我改变它的 X 值时,碗的形状会改变?当球在中心时如何保持不变?

4

1 回答 1

1

为什么当我改变它的 X 值时,碗的形状会改变?

你看到的是应用在球上的透视变形。

当球在中心时如何保持不变?

使用更长的“镜头”,即更窄的视野来减少透视失真。你可以通过使用来做到这一点glFrustum,或者你使用一些辅助函数,比如gluPerspective它可以有效地做到这一点:

void gluPerspective(
    float fovyInDegrees,
    float aspectRatio,
    float znear,
    float zfar)
{
    float ymax, xmax;
    float temp, temp2, temp3, temp4;
    ymax = znear * tanf(fovyInDegrees * M_PI / 360.0);
    xmax = ymax * aspectRatio;
    glFrustum(-xmax, xmax, -ymax, ymax, znear, zfar);
}

请注意,在仿射透视图中,视图边缘总是会有一些失真。

于 2013-07-03T09:48:27.953 回答