透视投影变换的感想

今天在网上找到这篇文章:

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)的结果了!!!!!!

 

 

 

posted @ 2012-03-08 23:02  junjie020  阅读(260)  评论(0)    收藏  举报