齐次坐标系下的三维变换可以写成下面的形式:

$$ \left(\begin{array}{l}x^{\prime} \\ y^{\prime} \\ z^{\prime} \\ 1\end{array}\right)=\left(\begin{array}{llll}a & b & c & t_{x} \\ d & e & f & t_{y} \\ g & h & i & t_{z} \\ 0 & 0 & 0 & 1\end{array}\right) \cdot\left(\begin{array}{l}x \\ y \\ z \\ 1\end{array}\right) $$

Scale

$$ \mathbf{S}\left(s_{x}, s_{y}, s_{z}\right)=\left(\begin{array}{cccc}s_{x} & 0 & 0 & 0 \\ 0 & s_{y} & 0 & 0 \\ 0 & 0 & s_{z} & 0 \\ 0 & 0 & 0 & 1\end{array}\right) $$

Translation

$$ \mathbf{T}\left(t_{x}, t_{y}, t_{z}\right)=\left(\begin{array}{cccc}1 & 0 & 0 & t_{x} \\ 0 & 1 & 0 & t_{y} \\ 0 & 0 & 1 & t_{z} \\ 0 & 0 & 0 & 1\end{array}\right) $$

Rotation

旋转矩阵是正交矩阵,其矩阵的逆等于矩阵的转置。

绕轴旋转

Rotation around x-, y-, or z-axis

$$ \mathbf{R}_{x}(\alpha)=\left(\begin{array}{cccc}1 & 0 & 0 & 0 \\ 0 & \cos \alpha & -\sin \alpha & 0 \\ 0 & \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 0 & 1\end{array}\right) $$

$$ \mathbf{R}_{y}(\alpha)=\left(\begin{array}{cccc}\cos \alpha & 0 & \sin \alpha & 0 \\ 0 & 1 & 0 & 0 \\ -\sin \alpha & 0 & \cos \alpha & 0 \\ 0 & 0 & 0 & 1\end{array}\right) $$

$$ \mathbf{R}_{z}(\alpha)=\left(\begin{array}{cccc}\cos \alpha & -\sin \alpha & 0 & 0 \\ \sin \alpha & \cos \alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1\end{array}\right) $$

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/607945bd-0ec9-445b-bbe9-a2a9cbe42a7a/Untitled.png

绕着 x 轴旋转,说明 y 和 z 都是在进行旋转的,但 x 不变。因此绕 x 轴的旋转矩阵相比二维的旋转矩阵,第一行是不变的。中间部分和二维旋转矩阵一样。

绕 y 轴旋转不一样,这里涉及到我们要如何思考轴的相互顺序。

根据右手螺旋定则,x 叉乘 y 得到 z,y 叉乘 z 得到 x。但 z 叉乘 x 才能得到 y,是反的,因此 Ry 部分不一样。

<aside> 💡 我们能够解决一些简单的问题,复杂的问题可以转化成一些简单问题的组合。

</aside>

给定根据三个轴的旋转,能否将某一个方向旋转到任意一个方向上去?

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/611047f3-405d-48f4-9f3c-d7ea806bc2ad/Untitled.png

Rotation by angle α round axis n

Rodrigues' Rotation Formula

有人将任意一个旋转分解成通过 x y z 轴分别做旋转。

证明过程可以参考闫令琪老师的证明:

GAMES101_Lecture_04_supp.pdf