(转)Away3d透视投影矩阵推导

PerspectiveLens(透视镜头)
‍用SketchUp Pro画了个图来帮助推导Away3d 4.0透视矩阵

视点:(0,0,0)
near:视点角沿z轴到近侧裁剪平面(灰色)的距离 
far:视点沿z轴到远侧裁剪平面(红色)的距离
fieldOfView:在yz平面形成的视觉夹角(红色线之间的夹角的2倍,z轴是对称轴,)
focalLengthInv:焦距=near*Math.tan(fieldOfView*Math.PI/360)
aspectRatio:近侧裁剪平面w/近侧裁剪平面h

备注:图画的有点问题,应标示为h/2 ,


‍P1点在near面上的投影为P1',‍P2点在near面上的投影为P2',通过图可以看出P2'(y) < P1'(y),也是越远的点看起来越小,即近远小。

假设P1'(x',y',near)是P1(x,y,z)在近裁剪平面的投影点,根据三角形相似有y' / y  = near / z , 则y' = y * near / z ,将P1'映射到[-1,1],视平面的高度为h,映射变换后y' =  (y * near / z)  /  ( h/2), 而tan (fieldOfView/2) = (h/2) / near,于是有 y' =  y / (z  * tan(fieldOfView/2) )同理可得 x' =  x /  (z *  tan (fieldOfView/2) *aspectRatio ),线性变换 z' = (z- near)/(far- near) ,z映射到[0,1].


用齐次矩阵来表达三次变换,(x',y',z',1) = (x''/w,y''/w,z''/w,w/w) , 观察 y' 和 x'的计算公式都除以了z,我们设w = z,于是有x'' = x / (tan(fieldOfView/2) * aspectRatio)  ,  y'' = y / tan(fieldOfView/2) 下面考虑如果把z'‘ = (z- near)/(far- near)转换为类似
z'' = (z- near)/(far- near) *  系数m / z 的结构, 按D3D的CVV的z范围是[0, 1]。也就是说,D3D 中在近裁剪平面上的点投影之后的点会处于CVV的z=0平面上,而在远裁剪平面上的点投影之后的点会在CVV的z=1平面上。小于near和大于far的部分,不在(0,1)区间内,因此会被正确的裁剪。‍

当z = near时,z'‘ = 0,无论系数m是何值都无所谓
当z = far 时,z’‘ = 1,系数m为far。
假如z'‘ = (z- near)/(far- near) * far/z ,验证一下当z =[near, far] 是否在[0,1],如图

 

把公式转化一下z’' = z * far / ( far- near)   - near * far/ ( far- near)

最后得出齐次变换矩阵为:

 

‍[1/(tan(fieldOfView/2) * _aspectRatio),0,0,0

0,1/tan(fieldOfView/2),0,0,

0,0,a,1

0,0,b,0]

 

 

 

 

OrthographicLens(垂直镜头)

 

 
 

posted on 2013-06-17 14:44  苍蝇也是鸟  阅读(127)  评论(0)    收藏  举报

导航