【问题标题】:Creating bowling game. Ball shape is modified when chaging X-axis创建保龄球游戏。更改 X 轴时修改球的形状
【发布时间】:2013-06-30 19:04:17
【问题描述】:

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

【问题讨论】:

  • 问题是什么?
  • @Kevin 我在问为什么当我改变球的 X 值时,第二张图片中碗的形状会被修改。
  • 那叫透视,你的视野可能和你想象的不一样。
  • 实际上我是第一次使用 OpenGL 进行编码,在经历了很多头痛之后,我已经这样做了,然后就遇到了这个问题。你能建议任何解决方案/逻辑/代码吗?
  • 我已经付出了这么大的努力,但一个人刚刚投了我的票...... Huhhhh

标签: c++ eclipse opengl glut


【解决方案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);
}

请注意,在仿射透视中,视图边缘总会有一些变形。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多