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

时间:2020-03-05 18:57:45  来源:igfitidea点击:

我在XZ平面上绘制了一个椭圆,并在Y轴上稍稍向上设置了透视图,在Z轴上又重新设置了透视图,使用gluPerspective()从45度角看了椭圆的中心,设置了我的视锥。

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

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

解决方案

回答

调用gluPerspective()时,我们似乎使用1.0作为方面。我们应该使用宽度/高度。例如,如果视口为640x480,则可以使用1.33333作为Aspect参数。

回答

根据OpenGL规范:

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

外观应该是窗口宽度和高度的函数。具体来说,宽度除以高度(但要注意被零除)。

除非我们使用的窗口是正方形,否则我们可能会使用1作为不正确的外观。

回答

看起来gluPerspective调用上的Aspect参数需要调整。请参见手册页。如果窗口实际上是正方形的,则长宽比将为1,问题将消失。但是,窗口是矩形的,因此查看视锥必须是非正方形的。

将长宽比设置为window_width / window_height,椭圆应该看起来正确。请注意,每当窗口调整大小时,我们都需要更新此内容。如果我们使用的是GLUT,请设置glutReshapeFunc并在那里重新计算投影矩阵。