透视投影矩阵gluPerspective的使用说明

来源:互联网 发布:js设置input背景颜色 编辑:程序博客网 时间:2024/04/29 16:21

透视投影矩阵gluPerspective的使用说明

 

gluPerspective使用之前需要将glMatrixMode设置为GL_PROJECTION,设置gluPerspective时候需要提供Y方向的视角--fovy,视锥的纵横比--aspect,视锥的近平面坐标--near,视锥的远平面坐标--far。下面详细说明下这几个参数的意义。

fovy是一个角度,此角度以z轴为对称轴(被z轴平分吧);

aspect指的是视锥平面(垂直z轴)的宽高比;

近平面垂直z轴,near是近平面到坐标系中心的距离;

远平面垂直z轴,far是远平面到坐标系中心的距离;

 

需要注意的是在设置视锥体的时候是以独立的坐标系作为参照的,在设置的时候可以先认为同世界坐标系没有关系,比如说设置:gluPerspective(27,1, 5,100),这个意思是说在设置视锥体的参考坐标系下,fovy为27°(z轴对称),近平面距离中心的距离为5(垂直z轴),远平面距离中心的距离为100(垂直z轴)。然后此设置在世界坐标系下的意义为:fovy为27°(lookat-eye轴对称),近平面距离eye的距离为5(垂直lookat-eye轴),远平面距离eye的距离为100(垂直lookat-eye轴)。

 

由上说明可见投影矩阵的最终的效果受到lookat矩阵的影响,下面说明如何设置物体的位置,使物体能够出现在视锥体中(其实应该是物体在视锥体才能被看到啊,但是初学者往往是不知道如何正确把物体放入视锥体中观察)。

其实根据上述对视锥体的设置说明可以知道,在view坐标系(lookat矩阵转换后的坐标系)下,只要物体放置在距离eye,不妨设物体为p,距离eye记为d,只要d> near && d < far那么这个物体是可能会被看见的,为什么说可能呢,因为还受到fovy的影响,如果|p.y| >|d*tan(fovy)| 那么物体也是看不见的。同理还需要考虑fovx的情况,fovx可以根据fovy和aspect求出。

 

相关公式:

1.根据fovy求fovx

fovx = 2 * actan(aspect * tan(fovy/2));

 

2.根据窗口宽度width和窗口距离distance求fovy

fovy = 2 * actan(width / (2 * distance));

原创粉丝点击