跳到主要内容

三维空间变换

1. 平移(Translation)​

齐次坐标

给三维空间坐标引入第 4 个分量 ww,使平移变换也能表示为矩阵乘法,从而将所有几何变换统一为矩阵运算。

平移变换将点 (x,y,z)(x, y, z) 移动到 (x+tx,y+ty,z+tz)(x + t_x, y + t_y, z + t_z):

x′=x+txy′=y+tyz′=z+tz⇒[x′y′z′1]=[100tx010ty001tz0001][xyz1]\begin{aligned} x' &= x + t_x \\ y' &= y + t_y \\ z' &= z + t_z \end{aligned} \quad \Rightarrow \quad \begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}
平移矩阵
T(tx,ty,tz)=[100tx010ty001tz0001]T(t_x, t_y, t_z) = \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix}

2. 缩放(Scale)​

缩放变换将点 (x,y,z,w)(x, y, z, w) 缩放到 (sx⋅x,sy⋅y,sz⋅z,w)(s_x \cdot x, s_y \cdot y, s_z \cdot z, w):

x′=sx⋅xy′=sy⋅yz′=sz⋅zw′=w⇒[x′y′z′w′]=[sx0000sy0000sz00001][xyzw]\begin{aligned} x' &= s_x \cdot x \\ y' &= s_y \cdot y \\ z' &= s_z \cdot z \\ w' &= w \end{aligned} \quad \Rightarrow \quad \begin{bmatrix} x' \\ y' \\ z' \\ w' \end{bmatrix} = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ w \end{bmatrix}
缩放矩阵
S(sx,sy,sz)=[sx0000sy0000sz00001]S(s_x, s_y, s_z) = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

3. 旋转(Rotation)​

以绕 Z 轴旋转 θ\theta,为例:

x′=xcos⁡θ−ysin⁡θy′=xsin⁡θ+ycos⁡θz′=z⇒[x′y′z′1]=[cos⁡θ−sin⁡θ00sin⁡θcos⁡θ0000100001][xyz1]\begin{aligned} x' &= x \cos\theta - y \sin\theta \\ y' &= x \sin\theta + y \cos\theta \\ z' &= z \end{aligned} \quad \Rightarrow \quad \begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0 \\ \sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}

同样地,绕其它坐标轴旋转也可以推导出其矩阵形式。

绕坐标轴的旋转

绕 Z 轴:

Rz(θ)=[cos⁡θ−sin⁡θ00sin⁡θcos⁡θ0000100001]R_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0 \\ \sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

绕 X 轴:

Rx(θ)=[10000cos⁡θ−sin⁡θ00sin⁡θcos⁡θ00001]R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta & 0 \\ 0 & \sin\theta & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

绕 Y 轴:

Ry(θ)=[cos⁡θ0sin⁡θ00100−sin⁡θ0cos⁡θ00001]R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -\sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

rotate

如上图所示,对于任意一点 P(x,y,z)P(x, y, z),用向量表示为 v\bm{v},旋转轴单位向量为 k\bm{k}。

第一步:向量分解

将 v\bm{v} 分解为平行于 k\bm{k} 的分量 v∥\bm{v}_{\parallel} 和垂直于 k\bm{k} 的分量 v⊥\bm{v}_{\perp}:

v∥=(v⋅k)kv⊥=v−v∥=v−(v⋅k)k\begin{aligned} \bm{v}_{\parallel} &= (\bm{v} \cdot \bm{k}) \bm{k} \\ \bm{v}_{\perp} &= \bm{v} - \bm{v}_{\parallel} = \bm{v} - (\bm{v} \cdot \bm{k}) \bm{k} \end{aligned}

第二步:构造局部正交基

以 k\bm{k} 为旋转轴,构造一个局部坐标系:

ez=k(旋转轴,类比z轴)ex=v⊥∣v⊥∣(水平分量方向,类比x轴)ey=w=k×ex(垂直分量方向,类比y轴)\begin{aligned} \bm{e}_z &= \bm{k} & \text{(旋转轴,类比z轴)} \\ \bm{e}_x &= \frac{\bm{v}_{\perp}}{|\bm{v}_{\perp}|} & \text{(水平分量方向,类比x轴)} \\ \bm{e}_y &= \bm{w} = \bm{k} \times \bm{e}_x & \text{(垂直分量方向,类比y轴)} \end{aligned}

第三步:绕轴旋转

在局部坐标系中,绕 k\bm{k} 旋转 θ\theta 等价于绕 Z 轴旋转:

v⊥′=cos⁡θ⋅v⊥+sin⁡θ⋅ey⋅∣v⊥∣=cos⁡θ⋅v⊥+sin⁡θ⋅(k×v⊥)\begin{aligned} \bm{v}'_{\perp} &= \cos\theta \cdot \bm{v}_{\perp} + \sin\theta \cdot \bm{e}_y \cdot |\bm{v}_{\perp}| \\ &= \cos\theta \cdot \bm{v}_{\perp} + \sin\theta \cdot (\bm{k} \times \bm{v}_{\perp}) \end{aligned}

由于 k×v∥=0\bm{k} \times \bm{v}_{\parallel} = 0,所以 k×v⊥=k×v\bm{k} \times \bm{v}_{\perp} = \bm{k} \times \bm{v}。

平行分量旋转后不变:

v∥′=v∥\bm{v}'_{\parallel} = \bm{v}_{\parallel}

第四步:合并得到旋转后的向量

v′=v∥′+v⊥′=v∥+cos⁡θ⋅v⊥+sin⁡θ⋅(k×v)=(v⋅k)k+cos⁡θ⋅(v−(v⋅k)k)+sin⁡θ⋅(k×v)=cos⁡θ⋅v+(1−cos⁡θ)(v⋅k)k+sin⁡θ⋅(k×v)\begin{aligned} \bm{v}' &= \bm{v}'_{\parallel} + \bm{v}'_{\perp} \\ &= \bm{v}_{\parallel} + \cos\theta \cdot \bm{v}_{\perp} + \sin\theta \cdot (\bm{k} \times \bm{v}) \\ &= (\bm{v} \cdot \bm{k}) \bm{k} + \cos\theta \cdot (\bm{v} - (\bm{v} \cdot \bm{k}) \bm{k}) + \sin\theta \cdot (\bm{k} \times \bm{v}) \\ &= \cos\theta \cdot \bm{v} + (1 - \cos\theta)(\bm{v} \cdot \bm{k}) \bm{k} + \sin\theta \cdot (\bm{k} \times \bm{v}) \end{aligned}

第五步:写成矩阵形式

利用叉积的矩阵表示 k×v=[k]×v\bm{k} \times \bm{v} = [\bm{k}]_{\times} \bm{v},其中:

[k]×=[0−kzkykz0−kx−kykx0][\bm{k}]_{\times} = \begin{bmatrix} 0 & -k_z & k_y \\ k_z & 0 & -k_x \\ -k_y & k_x & 0 \end{bmatrix}

以及外积 (v⋅k)k=(kkT)v(\bm{v} \cdot \bm{k}) \bm{k} = (\bm{k} \bm{k}^T) \bm{v},可得:

v′=(cos⁡θ⋅I+(1−cos⁡θ)kkT+sin⁡θ⋅[k]×)v\bm{v}' = \left( \cos\theta \cdot I + (1 - \cos\theta) \bm{k} \bm{k}^T + \sin\theta \cdot [\bm{k}]_{\times} \right) \bm{v}
绕任意轴旋转
Rk(θ,k)=[cos⁡θ+kx2cp⁡kxkycp⁡−kzsin⁡θkxkzcp⁡+kysin⁡θ0kykxcp⁡+kzsin⁡θcos⁡θ+ky2cp⁡kykzcp⁡−kxsin⁡θ0kzkxcp⁡−kysin⁡θkzkycp⁡+kxsin⁡θcos⁡θ+kz2cp⁡00001]R_{\bm{k}}(\theta,\bm{k}) = \begin{bmatrix} \cos\theta + k_x^2\operatorname{cp} & k_x k_y\operatorname{cp} - k_z\sin\theta & k_x k_z\operatorname{cp} + k_y\sin\theta & 0 \\ k_y k_x\operatorname{cp} + k_z\sin\theta & \cos\theta + k_y^2\operatorname{cp} & k_y k_z\operatorname{cp} - k_x\sin\theta & 0 \\ k_z k_x\operatorname{cp} - k_y\sin\theta & k_z k_y\operatorname{cp} + k_x\sin\theta & \cos\theta + k_z^2\operatorname{cp} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

其中 cp⁡=1−cos⁡θ\operatorname{cp} = 1 - \cos\theta

换个角度看,绕任意轴旋转本质上就是一次基变换:

  1. 先将旋转轴对齐到 Z 轴(换到新基),变换矩阵为 MM
  2. 在新基下执行简单的 Rz(θ)R_z(\theta)
  3. 逆变换回原基,变换矩阵为 M−1M^{-1}

即 R(k,θ)=M−1Rz(θ)MR(\bm{k}, \theta) = M^{-1} R_z(\theta) M