如何在OpenGL中绕视线旋转时避免形变?

4

我在XZ平面上画了一个椭圆,然后将视角稍微向Y轴上方和Z轴后方偏移,以45度的角度从中心观察椭圆,使用gluPerspective()设置我的视景体。

ellipse

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

rotated ellipse

我需要做什么来防止这种变形(或至少考虑它),以便绕视线旋转保留椭圆的主轴(在这种情况下,使其超出视口)?
3个回答

5

看起来你在调用gluPerspective()时使用了1.0作为宽高比。你应该使用宽度/高度。例如,如果你的视口大小是640x480,那么你应该使用1.33333作为宽高比参数。


啊,我在我的glutReshapeFunc()回调函数中将窗口宽度除以高度来获取我的纵横比,但我忘记先将宽度转换为浮点数。差一点就成功了,四舍五入的错误。谢谢。 - rampion

3
根据OpenGL规范:
void gluPerspective( GLdouble fovy,
                     GLdouble aspect,
                     GLdouble zNear,
                   GLdouble zFar )

宽高比应该是您的窗口宽度和高度的函数。具体来说,是宽度除以高度(但要注意除以零的情况)。

也许您正在使用1作为宽高比,但除非您的窗口是正方形,否则这是不准确的。


1

看起来你的gluPerspective调用中的aspect参数需要调整。请参见Man页面。如果你的窗口是物理正方形,那么宽高比将为1,你的问题就会消失。然而,你的窗口是矩形的,所以视锥体需要是非正方形的。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接