【问题标题】:Keeping a square clipping volume square, regardless of viewport size in opengl?无论opengl中的视口大小如何,保持正方形裁剪体积正方形?
【发布时间】:2013-03-21 07:26:10
【问题描述】:

我正在阅读 OpenGL SuperBible 第 4 版。有一个描述,在一个又高又薄的窗口中,如果视口与窗口的尺寸匹配,但它被映射到一个方形的裁剪体积,图像将显得扭曲(像视口一样高而薄)。

保持图像正方形的解决方案如下代码:

// Establish clipping volume (left, right, bottom, top, near, far) 
aspectRatio = (GLfloat)w / (GLfloat)h; 
if (w <= h)       
    glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else       
    glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);

对这段代码给出了解释,但我就是无法理解。为什么我们要根据 aspectRatio 来扩展裁剪体积的高度?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    您需要注意 OpenGL 中的两个纵横比:

    1. 视口的纵横比,在调用glViewport时指定
    2. 视锥体的纵横比,通过投影变换指定,无论是正交(例如,由glOrtho 设置)还是透视(由glFrustum 设置,或gluPerspective 最常见)。

    现在,为了保持正方形呈现为正方形,两个纵横比需要匹配。当您调整窗口大小时,您通过调用 glViewport( 0, 0, width, height ); 隐式设置视口的纵横比

    指定投影变换的纵横比是显式的,例如当您调用gluPerspective 时,因为它的第二个参数是视锥体的纵横比。然而,对于像glOrthoglFrustum 这样的调用,视锥体的纵横比由视体积的宽度和高度控制。以您提到的正交情况为例(对于透视投影,同样的讨论也适用),此处查看体积的宽度right - left,同样,高度是top - bottom ,而这两个量的比值就是观看量的纵横比。

    现在,请记住,我们需要两个纵横比匹配。我们不太可能修改视口,因为通常情况下您希望使用窗口中的所有像素,或者不冒被裁剪对象的风险,因此我们不得不修改查看体积的纵横比以获得它们匹配。我们通过根据视口的纵横比修改查看体积的宽度或高度来做到这一点,这就是您在提供的代码中看到的内容。特别是,如果视口的纵横比大于 1.0(即,比高宽),那么我们需要让我们的视域更宽,这就是为什么我们乘以 leftright强>由纵横比。同样,如果视口的纵横比小于 1.0,我们需要将查看体积调高。在这种情况下,我们使用纵横比的倒数(将大于 1.0),为 topbottom 提供适当的缩放。

    【讨论】:

    • 我想也许我真的不明白视口和视锥体之间的关系是什么。我想当我知道这一点时,我就会明白你在回答中的意思。
    • 这是我能找到的对视口映射的最佳视觉解释:relativity.net.au/gaming/java/Frustum.html
    • @BeeBand 也许这image 有帮助。 图像平面图像矩形,有时被称为,是由近剪裁平面上的视锥体的边定义的矩形。 OpenGL 的视口映射到图像矩形,这些是您需要保持一致的纵横比。以下是我教授的课程中的一些notes,它们还解释了您可能会发现有用的关系。
    猜你喜欢
    • 2011-05-23
    • 2011-05-30
    • 2012-12-21
    • 2013-12-30
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多