在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并在那里重新计算投影矩阵。