【问题标题】:How can I prevent deformation when rotating about the line-of-sight in OpenGL?在 OpenGL 中绕视线旋转时如何防止变形?
【发布时间】:2010-09-09 21:52:24
【问题描述】:

我在 XZ 平面上画了一个椭圆,并在 Y 轴和 Z 轴上稍微向上设置我的视角,从 45 度角看椭圆的中心,使用 gluPerspective() 设置我的观看挫败感。

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

我需要做些什么来防止这种变形(或至少解决它),所以围绕视线的旋转会保留椭圆的感知主轴(在这种情况下,导致它超出视口)?

【问题讨论】:

    标签: c opengl


    【解决方案1】:

    当您调用 gluPerspective() 时,您似乎使用 1.0 作为方面。您应该使用宽度/高度。例如,如果您的视口是 640x480,您将使用 1.33333 作为宽高比参数。

    【讨论】:

    • 啊,我在 glutReshapeFunc() 回调中将窗口宽度除以高度以获得我的纵横比,但我忘了先将宽度转换为浮点数。 Bada-bing,Bada-boom,舍入误差。谢谢。
    【解决方案2】:

    根据 OpenGL 规范:

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

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

    也许您使用 1 作为不准确的方面,除非您的窗口是正方形。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多