(转)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(垂直镜头)
浙公网安备 33010602011771号