今天在网上找到这篇文章:
http://blog.csdn.net/popy007/article/details/1797121
里面详细的说明了如何推导出一个OpenGL的透视投影变换矩阵
其中推导出的第一个投影矩阵为:
[ ]
N 0 0 0
0 N 0 0
0 0 a b
0 0 -1 0
[ ]
这是由Pproj = (-N*x/z, -N*y/z, -(a*z+b)/z)换算出的一个矩阵来的
那为什么这里要用z = -(a*z+b)/z来替换呢?
作者已经说了,这样替换的最主要的目的是为了之后的规范化计算而写成的
那为什么一定要将z写成 -(a*z+b)/z 这个等式呢?
经过一大翻的思考,总结出如下:
除以-z这个意图很明显,是为了与之前的透视除法一致,所以必须要这样写
那为什么是a*z + b呢?
一看上去感觉好暴力,但仔细思考,这里其实是一个移动的平面来的!!而且这个平面在接下来的透视投影之前做规范化处理需要用到的!
这个移动的平面是 -(a*z+b)/z 在[N, F]中的,由于-z是通过为透视除法而生成的,我们可以认为这个平面主要是由a*z + b来决定的!
而这个a*z + b与平面的方程 a*x + b*y + c*z + d = 0其实就是同一回事,只是a变成了c,b变成了d,而x和y都是0
但要注意这个平面的范围不在[N, F]的范围之内(不能忽视前面的透视除法)
所以我个人的愚见,将其理解成为一个移动的平面,便于自己的理解!
写于3月9日:
昨天的写的东西没有很强的理论可以解析到,只是自己的一时意会,但数学是严谨的,所以今天拼命找资料,并不断地反思,最后在这里找到了答案:
http://www.songho.ca/opengl/gl_projectionmatrix.html
为什么会有(-(a*z+b)/z)呢?这是因为假设透视投影后 zp =-N, 而规范会变换的zn = zp/wp,有zn = (a*x + b*y + c*z + d*w)/wp
而由于透视投影的关系,我们可以认为a 和 b都是等于0的,因为zn 与他们没有任何关系,所以
zn = (c*z + d*w) /wp,又因为w = 1,wp = -z,所以就有上面那个式子:(-(a*z + b)/z)的结果了!!!!!!