忆龙2009:OPENGL 透视投影

      这是一个简单的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>键来转动格子,这样可以更直观地观察透视投影的效果。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值