文章

GAMES101 第4讲 变换(三维)

GAMES101 第4讲 变换(三维)

三维空间中的变换

三维空间的齐次坐标表示

  • 3D的点: $(x, y, z, 1)^T$
  • 3D的向量: $(x, y, z, 0)^T$

在三维齐次坐标中, 一个点的坐标 $(x/w, y/w, z/w)$ 可以表示为:

\[\begin{bmatrix} x \\ y \\ z \\ w \end{bmatrix} = \begin{bmatrix} x/w \\ y/w \\ z/w \\ 1 \end{bmatrix} , w \neq 0\]

三维空间的仿射变换的齐次坐标形式为:

\[\begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} a & b & c & t_x \\ d & e & f & t_y \\ g & h & i & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}\]

其中, $ a, b, c, d, e, f, g, h, i $ 为线性变换矩阵的参数, $ t_x, t_y, t_z $ 为平移矩阵的参数

组合后的变换矩阵

组合后的变换矩阵的意义是: 先进行线性变换, 再进行平移变换

三维空间的仿射变换

缩放矩阵

缩放矩阵的对角线上的元素分别为 $s_x, s_y, s_z$, 最后一排为 $(0, 0, 0, 1)$

\[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}\]

平移矩阵

平移矩阵的最后一列分别为 $t_x, t_y, t_z$, 最后一排为 $(0, 0, 0, 1)$

\[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}\]

旋转矩阵与欧拉角

旋转矩阵 ss 绕着 $x-, y-, z-$ 轴旋转的矩阵分别如下:

当绕着 $x-$ 轴旋转时, $x$ 不变, $y, z$ 会发生变化, 所以矩阵的第一行与第一列不变:

\[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}\]

当绕着 $z-$ 轴旋转时, $z$ 不变, $x, y$ 会发生变化, 所以矩阵的第三行与第三列不变:

\[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}\]

当绕着 $y-$ 轴旋转时, $y$ 不变, $x, z$ 会发生变化, 但是和绕着 $x-$ 轴和 $z-$ 轴旋转不同, 因为这里的 $y-$ 轴是右手坐标系, 也就是说 $ \vec{x} \times \vec{z} = \vec{-y} $, 而 $ \vec{z} \times \vec{x} = \vec{y} $, 所以矩阵的第二行与第二列不变, 但是第一行与第一列和第三行与第三列的变换与 $R_x(\theta)$ 和 $R_z(\theta)$ 是相反的:

\[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}\]

将三个旋转矩阵组合起来, 可以得到任意旋转的矩阵:

\[R(\theta_x, \theta_y, \theta_z) = R_x(\theta_x) \cdot R_y(\theta_y) \cdot R_z(\theta_z)\]

其中, $\theta_x, \theta_y, \theta_z$ 分别为绕着 $x-, y-, z-$ 轴旋转的角度, 称为欧拉角

欧拉角

在飞机的模拟中, 通常使用俯仰角(Pitch), 偏航角(Yaw), 滚转角(Roll) 来描述飞机的姿态

罗德里格斯公式(Rodrigues’ Formula)

绕着单位向量 $\vec{n}$ 旋转 $\alpha$ 角度的旋转, 该 $\vec{n}$ 过原点, 则旋转矩阵为:

\[R_(\mathbf{n}, \alpha) = \cos(\alpha) \mathbf{I} + (1 - \cos(\alpha)) \mathbf{n} \mathbf{n}^T + \sin(\alpha) \mathbf{N}\]

向量 $\mathbf{n}$ 的叉乘矩阵 $\mathbf{N}$ 定义如下:

\[\mathbf{N} = \begin{bmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \end{bmatrix}\]

如果要绕着任意轴旋转, 可以先将所有东西移动到使得旋转轴过原点, 然后再进行旋转, 最后再移动回去

本文由作者按照 CC BY 4.0 进行授权