我正在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值时会修改碗的形状?球在中心时如何保持不变?
答案 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);
}
请注意,仿射透视图中的视图边缘始终会有一些扭曲。