如何在OpenGL中绕视线旋转时防止变形?

时间:2008-09-17 02:38:42

标签: c opengl

我在XZ平面上绘制了一个椭圆,并将我的视角略微向上设置在Y轴上,然后回到Z上,从45度角观察椭圆的中心,使用gluPerspective()来设置我观看了frustrum。

ellipse

未旋转,椭圆的长轴跨越视口的宽度。当我围绕我的视线旋转90度时,椭圆的主轴现在跨越我的视口的高度,从而使椭圆变形(在这种情况下,使其看起来不那么偏心)。

rotated ellipse

我需要做些什么来防止这种变形(或至少考虑到它),因此围绕视线的旋转可以保留椭圆的感知长轴(在这种情况下,使其超出视口)?

3 个答案:

答案 0 :(得分:5)

当你调用gluPerspective()时,看起来你正在使用1.0作为方面。你应该使用宽度/高度。例如,如果您的视口是640x480,则使用1.33333作为方面参数。

答案 1 :(得分:3)

根据OpenGL规范:

void gluPerspective( GLdouble fovy,
                     GLdouble aspect,
                     GLdouble zNear,
                   GLdouble zFar )

Aspect应该是窗口宽度和高度的函数。特别是宽度除以高度(但要注意除以零)。

除非您的窗口是正方形,否则您可能使用1作为不准确的方面。

答案 2 :(得分:1)

看起来你的gluPerspective调用中的aspect参数需要调整。见The Man Page。如果您的窗口是物理方形,则纵横比为1,您的问题就会消失。但是,您的窗口是矩形的,因此视锥体必须是非方形的。

将宽高比设置为window_width / window_height,椭圆应该看起来正确。请注意,只要窗口调整大小,您就需要更新它;如果您正在使用GLUT设置glutReshapeFunc并重新计算其中的投影矩阵。