此文是 齐次坐标与二维图形基本几何变换的矩阵推导 的衍生。理解二维的变换就能轻松推导三维的。
三维图形基本几何变换#
描述从点 (x, y, z) 到 (x + dx, y+ dy, z + dz)
引入齐次坐标,可表述为 (x, y, z, 1) 变形推导为 (x + dx, y+ dy, z + dz, 1)
已知:
a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44xyz1=x+dxy+dyz+dz1
得
⎩⎨⎧a11x+a12y+a13z+a14=x+dxa21x+a22y+a23z+a24=y+dya31x+a32y+a33z+a34=z+dza41x+a42y+a43z+a44=1
解得
100001000010dxdydz1
描述从点 (x, y, z) 到 (sx*x, sy*y, sz*z),sx sy sz 为常量。
引入齐次坐标,可表述为 (x, y, z, 1) 变形推导为 (sx*x, sy*y, sz*z, 1)
已知:
a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44xyz1=sx∗xsy∗ysz∗z1
得
⎩⎨⎧a11x+a12y+a13z+a14=sx∗xa21x+a22y+a23z+a24=sy∗ya31x+a32y+a33z+a34=sz∗za41x+a42y+a43z+a44=1
解得
sx0000sy0000sz00001
对于三维的旋转可以分解为三个矩阵(绕 x 轴旋转、绕 y 轴旋转、绕 z 轴旋转)的乘积
绕 z 轴旋转 —— Rz(β)#
还记得我们对二维旋转的推导吗?我们在 x, y 轴构成的平面上进行旋转时其实也可以视为是在绕着 z 轴的旋转。那么其三维的旋转其实就很好理解了,无非就是增加一个固定不变的维度罢了。
即:
a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44xyz1=xcosβ−ysinβycosβ+xsinβz1
得:
⎩⎨⎧a11x+a12y+a13z+a14=xcosβ−ysinβa21x+a22y+a23z+a24=ycosβ+xsinβa31x+a32y+a33z+a34=za41x+a42y+a43z+a44=1
解:
Rzβ=cosβsinβ00−sinβcosβ0000100001
绕 x 轴旋转 —— Rx(α)#
同理可得(固定 x)
Rxα=10000cosαsinα00−sinαcosα00001
绕 y 轴旋转 —— Ry(γ)#
同理可得(固定 y)
Ryγ=cosγ0−sinγ00100sinγ0cosγ00001
于是我们得到了三维的旋转矩阵
R=RxαRyγRzβ
但是看到这一定会产生这样的疑问 —— 我该如何将绕某个轴的 θ 角分解为 α β γ 呢?这个疑问先留着,我好再水一篇文章。
只不过目前旋转的轴都被限制在过原点这一前提下,如果旋转轴并不过原点的话,得先把轴平移到过原点,随后再旋转,旋转结束后再平移到原来的位置。任何复杂的变换都可以分解为数个简单变换的合成。
沿着 X 轴切变#
即描述从 (x, y, z) 到 (x + my + nz, y, z), m,n 均为正切函数
a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44xyz1=x+m∗y+n∗zyz1
解得
1000m100n0100001
沿着 Y 轴切变#
描述点 (x, y, z) 到点 (x, y + mx + nz, z)
求解就跳过了,相信聪明的大家一定看出来了行列项代表的意思了
1m0001000n100001
沿着 Z 轴切变#
描述点 (x, y, z) 到点 (x, y, z + mx + ny)
10m001n000100001