0

我有一个将 3D 立方体绘制到屏幕上的基本 opengl 项目。我的分辨率是 1600 x 900。无论相机离立方体多远或近,立方体总是水平拉伸,看起来像一个三角形。我已经将同一个多维数据集加载到一个 java 项目中,并且它绘制得很完美。但是在 C++ 中使用相同的代码,我得到了拉伸效果。关于可能导致这种情况的任何建议?

GLvoid RenderSettings::init()
{
    const GLfloat FOV = 60.0F; 
    const GLfloat ASPECT_RATIO = getScreenWidth() / getScreenHeight();
    const GLfloat NEAREST_VIEW = 1.0F;
    const GLfloat FARTHEST_VIEW = 1000.0F;

    glViewport(0, 0, getScreenWidth(), getScreenHeight());

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(FOV, ASPECT_RATIO, NEAREST_VIEW, FARTHEST_VIEW);

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glDepthFunc(GL_LEQUAL);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}
4

1 回答 1

1

const GLfloat ASPECT_RATIO = getScreenWidth() / getScreenHeight();

有你的问题。我假设getScreenWidthgetScreenHeight返回整数。在 C/C++ 中,当除以整数时,这发生在整数运算中,这意味着结果将(总是)向下舍入到下一个较小的整数。您将结果分配给的类型无关紧要。C/C++ 分别查看 L 值和 R 值的类型。您可以通过将除法的一侧类型转换为浮点数来修复它(通常您只需将两者都转换),即

GLfloat const ASPECT_RATIO = (float)getScreenWidth() / (float)getScreenHeight();

另请注意,const限定符是左关联的,即它作用于它的剩余部分。只有当它是变量定义语句中的第一个标记时,它才会向右移动。但是许多语言纯粹主义者(包括我)认为这看起来很难看。在类型之后也写 const 更适合自然语言。

于 2013-04-07T11:47:15.087 回答