主要包含模型变换和视图变换。
2D变换
Scale
以矩阵形式表示:
\[
\begin{bmatrix}S_x & 0 \\ 0 & S_y\end{bmatrix}
\]
Reflect
以矩阵形式表示:
\[
\begin{bmatrix}-1 & 0 \\ 0 & 1\end{bmatrix}
\]
Shear
以矩阵形式表示:
\[
\begin{bmatrix}1 & Sh_x \\ Sh_y & 1\end{bmatrix}
\]
Rotate
以矩阵形式表示:
\[
\begin{bmatrix}\cos\theta & -\sin\theta \\ \sin\theta & \cos\theta\end{bmatrix}
\]
其具有一个性质,这个矩阵的逆矩阵等于其转置矩阵,即:
\[
\begin{bmatrix}\cos\theta & \sin\theta \\ -\sin\theta & \cos\theta\end{bmatrix}
\]
因为该矩阵是一个正交矩阵,而正交矩阵的逆矩阵等于其转置矩阵。
Translate
公式为:
\[
\begin{bmatrix}x' \\ y'\end{bmatrix} = \begin{bmatrix}x \\ y\end{bmatrix} + \begin{bmatrix}T_x \\ T_y\end{bmatrix}
\]
可以看出,这个公式不是矩阵乘法,而是向量加法。为了将其转换为矩阵乘法,我们需要使用齐次坐标。
齐次坐标
使用齐次坐标可以将线性变换和仿射变换统一表示为矩阵乘法。齐次坐标在二维空间中表示为三维向量,以Translate为例:
\[
\begin{bmatrix}x' \\ y' \\ w'\end{bmatrix} = \begin{bmatrix}1 & 0 & T_x \\ 0 & 1 & T_y \\ 0 & 0 & 1\end{bmatrix} \begin{bmatrix}x \\ y \\ 1\end{bmatrix}= \begin{bmatrix}x + T_x \\ y + T_y \\ 1\end{bmatrix}
\]
对于二维点,齐次坐标可以表示为 \((x, y, 1)^T\)。对于二维向量,齐次坐标可以表示为 \((x, y, 0)^T\)。这样,所有的变换都可以用矩阵乘法来表示。
二维点的z坐标要使用1(或者更宽泛的说,一个非0数)的原因是要保证拓展后的坐标表示同样可以完成点和向量之间的运算,如两个点做减法得到向量,或者点和向量做加法得到点。
也就是说,在齐次坐标中,\((x, y, w)^T\) 表示的点是 \((x/w, y/w)\),因此齐次坐标中将两个点相加得到的是这两个点的中点。
对于所有仿射变换,都可以用齐次坐标变化为矩阵相乘的形式:
\[
\begin{bmatrix}x' \\ y' \\ 1\end{bmatrix}=\begin{bmatrix}a & b & T_x \\ c & d & T_y \\ 0 & 0 & 1\end{bmatrix} \begin{bmatrix}x \\ y \\ 1\end{bmatrix}
\]
根据以上公式可以将原有的二维变换矩阵转换为齐次坐标形式:
\[
Scale = \begin{bmatrix}S_x & 0 & 0 \\ 0 & S_y & 0 \\ 0 & 0 & 1\end{bmatrix}, \quad
Reflect = \begin{bmatrix}-1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{bmatrix}, \quad
Shear = \begin{bmatrix}1 & Sh_x & 0 \\ Sh_y & 1 & 0 \\ 0 & 0 & 1\end{bmatrix}, \quad
Rotate = \begin{bmatrix}\cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1\end{bmatrix}, \quad
Translate = \begin{bmatrix}1 & 0 & T_x \\ 0 & 1 & T_y \\ 0 & 0 & 1\end{bmatrix}
\]
如果需要将多个变换组合在一起,可以将它们的矩阵相乘。比如需要先旋转45度再平移(2, 3),可以表示为\(T_{(2, 3)} \cdot R_{45} \cdot \begin{bmatrix}x \\ y \\ 1\end{bmatrix}\),按执行的顺序从右到左依次执行变换。
逆变换
对于变换\(M\),其逆变换\(M^{-1}\)可以撤销变换的效果。逆变换的矩阵可以通过求逆矩阵得到。
3D变换
三维点的齐次坐标表示为 \((x, y, z, 1)^T\),三维向量的齐次坐标表示为 \((x, y, z, 0)^T\)。对于点\((x, y, z, w)\),齐次坐标表示为 \((x/w, y/w, z/w)\)。(注意这里的w可以是任意非零数)
可以使用一个四维矩阵来表示三维变换:
\[
\begin{bmatrix}a & b & c & T_x \\ d & e & f & T_y \\ g & h & i & T_z \\ 0 & 0 & 0 & 1\end{bmatrix}
\]
可以表示先线性变换,再平移的变换。