OpenGL - 调整窗口大小时保持纵横比

Posted

技术标签:

【中文标题】OpenGL - 调整窗口大小时保持纵横比【英文标题】:OpenGL - maintaining aspect ratio upon window resize 【发布时间】:2012-04-17 02:37:29 【问题描述】:

我正在一个方形窗口中绘制一个多边形。当我调整窗口大小时,例如通过全屏显示,纵横比受到干扰。从参考资料中,我找到了一种保留纵横比的方法。代码如下:

    void reshape (int width, int height) 
    float cx, halfWidth = width*0.5f;
    float aspect = (float)width/(float)height; 
    glViewport (0, 0, (GLsizei) width, (GLsizei) height);
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(cx-halfWidth*aspect, cx+halfWidth*aspect, bottom, top, zNear, zFar);
    glMatrixMode (GL_MODELVIEW);

这里,cx 是 X 中 zNear 平面的眼睛空间中心。我请求是否有人可以解释我如何计算这个。我相信这应该是 glFrustum() 的前两个参数的平均值。我对吗?任何帮助将不胜感激。

【问题讨论】:

取决于您想要达到的目标。当前不保留方面的投影矩阵是什么?你使用过剩? 假设是通用的..glFrustum(左、右、下、上、近、远)。是的,使用 GLUT。 【参考方案1】:

看起来您想要做的是在纵横比发生变化时保持视野或视角。有关如何执行此操作的详细信息,请参阅 OpenGL 常见问题解答中标题为 9.085 How can I make a call to glFrustum() that matches my call to gluPerspective()? 的部分。这是简短的版本:

fov*0.5 = arctan ((top-bottom)*0.5 / near)
top = tan(fov*0.5) * near
bottom = -top
left = aspect * bottom
right = aspect * top

查看链接了解详情。

【讨论】:

是的,刚刚进行了这些计算并验证了您的答案。非常感谢!【参考方案2】:

前两个参数是眼睛空间中左右裁剪平面的 X 坐标。除非您正在使用离轴技巧(例如,在多个显示器上显示未居中的投影),否则左右应该具有相同的幅度和相反的符号。这将使您的 cx 变量为零。

如果您在理解 glFrustrum 时遇到困难,您可以随时使用 gluPerspective 代替,它的界面有些简化。

【讨论】:

感谢您的回答。我正在研究左、右、上和下如何随纵横比缩放,即,当它不统一时。

以上是关于OpenGL - 调整窗口大小时保持纵横比的主要内容,如果未能解决你的问题,请参考以下文章

如何在调整窗口大小时锁定纵横比?

OpenGL 防止在调整窗口大小时拉伸

WPF的窗口中的所有内容随窗口大小变化而同步变化

OpenGL窗口大小渲染问题

使用 freeglut 保持纵横比和比例独立于窗口大小

css 调整大小时保持容器的纵横比