赞
踩
前文中提到的模型变换(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.仿射变换和投影变换的区别
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。