变换
模型变换(Modeling)
视图变换(Viewing)
2D 变换
缩放
\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} s_x & 0 \\ 0 & s_y \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix}
发射(对称)
\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix}
切变
纵坐标不变,水平变化
\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} 1 & a \\ 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix}
旋转
默认情况下绕(0, 0)点旋转,逆时针旋转
R_{\theta} = \begin{bmatrix} cos\theta & -sin\theta \\sin\theta & cos\theta\end{bmatrix}
线性变换
x' = ax + by
y' = cx + dy
\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix}
x' = Mx
齐次坐标
为什么需要齐次坐标?
平移变换
x' = x + t_x \\
y' = y + t_y
平移无法表示成矩阵形式
\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} + \begin{bmatrix} t_x \\ t_y \end{bmatrix}
平移操作不属于线性变换
增加一个维度
2D\ point = (x, y, 1)^T
2D\ vector = (x, y, 0)^T
平移矩阵
\begin{pmatrix} x' \\ y' \\ w' \end{pmatrix} = \begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} \cdot \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x + t_x \\ y + t_y \\ 1 \end{pmatrix}
放射变换(Affine Transformations)
Affine map = linear map + translation
\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} a & b \\ c & d \end{pmatrix} \cdot \begin{pmatrix} x \\ y \end{pmatrix} + \begin{pmatrix} t_x \\ t_y \end{pmatrix}
使用齐次坐标
\begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{pmatrix} \cdot \begin{pmatrix} x \\ y \\ 1 \end{pmatrix}
逆变换
M^{-1}
组合变换
一个复杂变换可以由多个简单变换组成,变换的顺序至关重要(矩阵不满足交换律)。
变换分解
3D变换
齐次坐标
3D point = (x, y, z, 1)^T
3D vector = (x, y, z, 0)^T
矩阵表示
\begin{pmatrix} x' \\ y' \\ z' \\ 1 \end{pmatrix} = \begin{pmatrix} a & b & c & t_x \\ d & e & f & t_y \\ g & h & i & t_z \\ 0 & 0 & 0 & 1 \end{pmatrix} \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix}