如果(如您的问题所示)约定是点是列向量,并且前3行的最后元素确定转换,则底行的前3个元素不是位置偏移:转换的第4行矩阵用于透视投影,这是相机将3D点映射到2D视口的方式.如何使用4x4矩阵绘制点的草图:
result = 4x4 matrix * point
[ x' ] [ Rxx Rxy Rxz Tx ] [ x ]
[ ] [ ] [ ] -> R** is the rotation/scaling matrix
[ y' ] [ Ryx Ryy Ryz Ty ] [ y ]
[ ] = [ ] * [ ] T* is the translation vector
[ z' ] [ Rzx Rzy Rzz Tz ] [ z ]
[ ] [ ] [ ] P* fixes the camera projection plane
[ w' ] [ Px Py Pz Pw ] [ w ]
-> x' = dot_product3([Rxx,Rxy,Rxz], [x,y,z]) + Tx * w
-> y' = dot_product3([Ryx,Ryy,Ryz], [x,y,z]) + Ty * w
-> z' = dot_product3([Rzx,Rzy,Rzz], [x,y,z]) + Tz * w
-> w' = dot_product4([Px,Py,Pz,Pw], [x,y,z,w])
Run Code Online (Sandbox Code Playgroud)
3D点 - > 2D屏幕映射的最后一步是除以第4(w'
)坐标 - 因此,对于标准几何变换,最后一行通常应该是[0,0,0,1]
,这使得w
坐标保持不变.
如果底行的前3个元素不是0
,则矩阵通常会产生3D空间的奇怪,不均匀的失真.并且,尽管可以将最后一个元素用作均匀的反比例因子,但最好使用左上3x3子矩阵进行缩放,并将底行专用于相机.