前文中提到的模型变换(Model Transform)
和观察变换(View Transform)
都是由缩放变换(Sacle Transform)
,旋转变换(Rotation Transform)
和平移变换(Translation Transform)
这三种变换组合而成。其中缩放变换和旋转变换被称为线性变换(Linear Transform)
,线性变换和平移变换统称为仿射变换(Affine Transform)
。
1.缩放变换,可以用一个3x3的矩阵描述
$$ M_{s} = \left[\begin{matrix} Scale_x & 0 & 0 \\ 0 & Scale_y & 0 \\ 0 & 0 & Scale_z \\ \end{matrix} \right] $$
Unity3D中使用列向量来描述顶点信息,所以可以把顶点坐标右乘缩放矩阵完成缩放操作。
$$ \left[\begin{matrix} Scale_x & 0 & 0 \\ 0 & Scale_y & 0 \\ 0 & 0 & Scale_z \\ \end{matrix} \right] \left[\begin{matrix} x\\ y\\ z\\ \end{matrix} \right] = \left[\begin{matrix} Scale_x x \\ Scale_y y \\ Scale_z z\\ \end{matrix} \right] $$
2.旋转变换,可以用一个3x3的矩阵描述(正方向是逆时针方向)
$$ M_{rx} = \left[\begin{matrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \\ \end{matrix} \right] M_{ry} = \left[\begin{matrix} cos\theta & 0 & -sin\theta \\ 0 & 1 & 0 \\ 0 & sin\theta & cos\theta \\ \end{matrix} \right] M_{rz} = \left[\begin{matrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \\ \end{matrix} \right] $$
3.平移变换,与缩放变换和旋转变换不同平移变换是一个加法操作。事实上,用右乘一个3x3矩阵的方法是无法实现平移操作的,因为平移操作不是一个线性操作,所以我们需要用到齐次坐标,把三维向量扩展成一个四维向量。
$$ M_{t} = \left[\begin{matrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \\ \end{matrix} \right] $$
$$ \left[\begin{matrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \\ \end{matrix} \right] \left[\begin{matrix} x\\ y\\ z\\ w\\ \end{matrix} \right] = \left[\begin{matrix} x + t_x \\ y + t_y\\ z + t_z\\ w \end{matrix} \right] $$
4.仿射变换和投影变换的区别
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。