创造保龄球比赛。更改X轴时修改球形

时间:2013-07-03 07:27:54

标签: c++ eclipse opengl graphics logic

我正在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]);看起来像ball looks good

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

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值时会修改碗的形状?球在中心时如何保持不变?

1 个答案:

答案 0 :(得分: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);
}

请注意,仿射透视图中的视图边缘始终会有一些扭曲。