这是一个简单的OPENGL的示例程序,与前面的示例程序不同,前面使用的是正投影模式,而本例则使用透视投影。
透视投影的一个显著特征是透视缩短,即物体如果离照相机的距离越远,则它看上去就越小。透视投影可以看成一个金字塔的平截头体。靠近观察点的物体看上去会更大一些,因为和远处的物体相比,他们占据了视景体中相对较大的区域。
透视投影方法常用于动画、视觉模拟以及其它要求某种程度现实感比较强的应用领域,因为这种投影方式与我们现实生活中观察世界的方法比较类似。
glFrustum()定义了一个平截头体,它计算用于实现透视投影的矩阵,并把它与当前的投影矩阵相乘。视景体会将位于它之外的物体裁剪掉。平截头体的4个侧面,以及顶面及底面对应了视景体的6个裁剪平面。
我们可以使用工具函数库中的gluPerspective()函数代替glFrustum()来达到相同的效果。这个函数不指定近侧裁剪平面的两个角,而是指定y方向上视野的角度和纵横比。对于正方形屏幕,纵横比为1.0。这两个参数可以确定沿视线方向的平截头体金字塔型。另外,我们还需要指定观察点和近侧以及远侧裁剪平面的距离。
注意,gluPerspective()仅限于创建沿视线方向同时对称于x轴和y轴的平截头体。函数原型如下:
GLAPI void APIENTRY gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
使用gluPerspective()需要挑选正确的视野值,否则图像看上去会变形。为了获得完美的效果,可以根据自己眼睛在正常情况下距离屏幕有多远以及窗口有多大,同时根据距离和大小计算视野的角度。
以下是实现3*3格子在透视投影时的代码,视角采用了45度,你可以用<b>键来转动格子,这样可以更直观地观察透视投影的效果。