openGL中投影矩阵的推导

来源:互联网 发布:java将时间转换成秒 编辑:程序博客网 时间:2024/06/10 16:03

参考:http://www.songho.ca/opengl/gl_projectionmatrix.html
http://www.linuxidc.com/Linux/2015-08/122229.htm

透视投影

下面为透视投影的视锥体
这里写图片描述

其中,远裁剪平面距离原点为f, 近裁剪屏幕距离原点n。
设P(x0, y0,z0)投影到近平面上的Pn(x1, y1, z1)。
这里写图片描述

这里写图片描述
如图所示,我们分别求x1,y1,z1。沿着x轴方向看横切面如图所示:
这里写图片描述
投影后,x坐标为x1(在近裁剪平面投影),由相似三角形的性质,有:
这里写图片描述

n为负,是由于视锥体和投影矩阵坐标系不同,一个是view空间,一个是投影空间。z轴方向不同
这样其实实现了透视投影近大远小的效果,因为z0越大,则x1,y1越小。为了将这两个值转换到[-1,1]区间内,设l和r分别为近裁剪平面左右边框的x左边,即l=-w/2,r=w/2。为了使任何投影到近裁剪空间的点都在区间内,转换后,[l’, r’]属于[0,1],其中l’,r’分别为l和r转换后的值。因为是线性变化,可另x’=kx+b;
这里写图片描述
同理,y的表示:
这里写图片描述
x和y投影后的左边都有共同因子[-1/z0],正好对应变换后w=-z0。
接下来,我们看z要满足什么要求。为了简化讨论,根据以上结论,我们假设透视变换有下述形式:
这里写图片描述

这里写图片描述
于是
这里写图片描述
最后的变换矩阵为:
这里写图片描述

如果视锥体是对称的,r=-l,t=-b,则
这里写图片描述

z存在关系:
这里写图片描述
另外我们再看一个z2和z0关系,你会发现上述函数是有理函数,而z2和z0之间并不是线性关系。在近近裁剪平面的地方精度较高,反之则较低。如果[-n,-f]范围变大,则会引起深度精度问题(z-fighting)。所以n和f之间的距离应该尽量小,以减小深度缓存的精度问题。

原创粉丝点击