4

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

    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() 最初两个参数的平均值。我对吗?任何帮助将不胜感激。

4

2 回答 2

7

看起来您想要做的是在纵横比发生变化时保持视野或视角。请参阅标题为9.085 如何调用 glFrustum() 以匹配我对 gluPerspective() 的调用的部分?有关如何执行此操作的详细信息,请参阅 OpenGL 常见问题解答。这是简短的版本:

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

有关详细信息,请参阅链接。

于 2012-04-17T04:47:56.163 回答
1

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

如果您在理解 glFrustrum 时遇到困难,您总是可以使用 gluPerspective 来代替,它有一个稍微简化的界面。

于 2012-04-17T04:36:08.563 回答