透视投影(Perspective Projection)
void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);
其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。
参数fovy定义视野在X-Z平面的角度,范围是[0.0, 180.0];
参数aspect是投影平面宽度与高度的比率;
参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离,它们总为正值。
其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数fovy定义视野在Y-Z平面的角度,范围是[0.0,180.0];参数aspect是投影平面宽度与高度的比率;参数Near和Far分别是近远裁剪面沿Z负轴到视点的距离,它们总为正值。
参数fovy可以理解为“眼睛睁开的角度”,角度所及的范围就是窗口绘制的范围。角度小,看到的物体大,角度大,看到的物体小。当fovy为180时,窗口相对物体来说是无限大的,此时窗口上显示的物体则缩小为一个点。类似焦距的功能。
默认情况下,视点在坐标轴原点,坐标轴未做任何变换的话,原点就是屏幕(显示器)中心。
在NeHe的框架中,zNear=0.1f,zFar=100.0f,如果想绘制图形的话,需要将坐标轴移入屏幕,zFar>移入距离>zNear。
///
函数原型
gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)
首先得设置gluPerspective,来看看它的参数都表示什么意思
fovy,这个最难理解,我的理解是,眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔,
aspect,这个好理解,就是实际窗口的纵横比,即x/y
zNear,这个呢,表示你近处,的裁面,
zFar表示远处的裁面,
如果还没有理解就继续看,
我们知道,远处的东西看起来要小一些,近处的东西看起来会大一些,这就是透视原理
如下图所示
假设那两条线表示公路,理论上讲,它们的两条边是平行的,
但现实情况中,它们在远方(可以无限远)总要相交于一点,
实际线段AB的长度=CD的长度,只是在此例中使用了透视角,故会有如上的效果,是不是很接近现实的情况?
结合我们刚才这两个函数
zNear,眼睛距离近处的距离,假设为10米远,请不要设置为负值,OpenGl就傻了,不知道怎么算了,
zFar表示远处的裁面,假设为1000米远,
就是这两个参数的意义了,
再解释下那个"眼睛睁开的角度"是什么意思,
首先假设我们现在距离物体有50个单位距离远的位置,
在眼睛睁开角度设置为45时,请看大屏幕:
我们可以看到,在远处一个球,,很好玩哈,
现在我们将眼睛再张开点看,将"眼睛睁开的角度"设置为178
(180度表示平角,那时候我们将什么也看不到,眼睛睁太大了,眼大无神)
我们只看到一个点,,,,,,,,,,,,,,,,,,,,,,,,,,,
因为我们看的范围太大了,这个球本身大小没有改变,但是它在我们的"视界"内太小了,
反之,我们将眼睛闭小些,改为1度看看会出现什么情况呢?
在我们距离该物体3000距离远,"眼睛睁开的角度"为1时,我们似乎走进了这个球内,这个是不是类似于相机的焦距?
当我们将"透视角"设置为0时,我们相当于闭上双眼,这个世界清静了,
我们什么也看不到,,,,,,,,,