三维图形基本几何变换的矩阵推导
前言
此文是 齐次坐标与二维图形基本几何变换的矩阵推导 的衍生。理解二维的变换就能轻松推导三维的。
三维图形基本几何变换
平移
描述从点(x, y, z)到(x + dx, y+ dy, z + dz)
引入齐次坐标,可表述为 (x, y, z, 1) 变形推导为 (x + dx, y+ dy, z + dz, 1)
已知:
$$
\begin{pmatrix}
a_{11} & a_{12} & a_{13} & a_{14} \\
a_{21} & a_{22} & a_{23} & a_{24} \\
a_{31} & a_{32} & a_{33} & a_{34} \\
a_{41} & a_{42} & a_{43} & a_{44} \\
\end{pmatrix}
\begin{pmatrix}
x \\
y \\
z \\
1
\end{pmatrix}
=
\begin{pmatrix}
x + d_x \\
y+ d_y \\
z + d_z \\
1
\end{pmatrix}
$$
得
$$
\begin{cases}
a_{11}x + a_{12}y + a_{13}z + a_{14} = x + d_x \\
a_{21}x + a_{22}y + a_{23}z + a_{24} = y+ d_y \\
a_{31}x + a_{32}y + a_{33}z + a_{34} = z + d_z \\
a_{41}x + a_{42}y + a_{43}z + a_{44} = 1 \\
\end{cases}
$$
解得
$$
\begin{pmatrix}
1 & 0 & 0 & dx \\
0 & 1 & 0 & dy \\
0 & 0 & 1 & dz \\
0 & 0 & 0 & 1
\end{pmatrix}
$$
缩放
描述从点 (x, y, z) 到 (sx*x, sy*y, sz*z),sx sy sz 为常量。
引入齐次坐标,可表述为 (x, y, z, 1) 变形推导为 (sx*x, sy*y, sz*z, 1)
已知:
$$
\begin{pmatrix}
a_{11} & a_{12} & a_{13} & a_{14} \\
a_{21} & a_{22} & a_{23} & a_{24} \\
a_{31} & a_{32} & a_{33} & a_{34} \\
a_{41} & a_{42} & a_{43} & a_{44} \\
\end{pmatrix}
\begin{pmatrix}
x \\
y \\
z \\
1
\end{pmatrix}
=
\begin{pmatrix}
s_x * x \\
s_y * y \\
s_z * z \\
1
\end{pmatrix}
$$
得
$$
\begin{cases}
a_{11}x + a_{12}y + a_{13}z + a_{14} = s_x * x \\
a_{21}x + a_{22}y + a_{23}z + a_{24} = s_y * y \\
a_{31}x + a_{32}y + a_{33}z + a_{34} = s_z * z \\
a_{41}x + a_{42}y + a_{43}z + a_{44} = 1 \\
\end{cases}
$$
解得
$$
\begin{pmatrix}
s_x & 0 & 0 & 0 \\
0 & s_y & 0 & 0 \\
0 & 0 & s_z & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
$$
旋转
对于三维的旋转可以分解为三个矩阵(绕 x轴旋转、绕 y 轴旋转、绕 z 轴旋转)的乘积
绕 z 轴旋转 —— Rz(β)
还记得我们对二维旋转的推导吗?我们在 x, y 轴构成的平面上进行旋转时其实也可以视为是在绕着 z 轴的旋转。那么其三维的旋转其实就很好理解了,无非就是增加一个固定不变的维度罢了。
即:
$$
\begin{pmatrix}
a_{11} & a_{12} & a_{13} & a_{14} \\
a_{21} & a_{22} & a_{23} & a_{24} \\
a_{31} & a_{32} & a_{33} & a_{34} \\
a_{41} & a_{42} & a_{43} & a_{44} \\
\end{pmatrix}
\begin{pmatrix}
x \\
y \\
z \\
1
\end{pmatrix}
=
\begin{pmatrix}
xcosβ - ysinβ \\
ycosβ + xsinβ \\
z \\
1
\end{pmatrix}
$$
得:
$$
\begin{cases}
a_{11}x + a_{12}y + a_{13}z + a_{14} = xcosβ - ysinβ \\
a_{21}x + a_{22}y + a_{23}z + a_{24} = ycosβ + xsinβ \\
a_{31}x + a_{32}y + a_{33}z + a_{34} = z \\
a_{41}x + a_{42}y + a_{43}z + a_{44} = 1 \\
\end{cases}
$$
解:
$$
R_{z}β =
\begin{pmatrix}
cosβ & -sinβ & 0 & 0 \\
sinβ & cosβ & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
$$
绕 x 轴旋转 —— Rx(α)
同理可得(固定x)
$$
R_{x}α =
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & cosα & -sinα & 0 \\
0 & sinα & cosα & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
$$
绕 y 轴旋转 —— Ry(γ)
同理可得(固定y)
$$
R_{y}γ =
\begin{pmatrix}
cosγ & 0 & sinγ & 0 \\
0 & 1 & 0 & 0 \\
-sinγ & 0 & cosγ & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
$$
于是我们得到了三维的旋转矩阵
$$
R = R_{x}αR_{y}γR_{z}β
$$
但是看到这一定会产生这样的疑问 —— 我该如何将绕某个轴的 θ 角分解为 α β γ呢?欧拉角与罗德里格旋转公式间的相互转换,我后面再水一篇文章。
只不过目前旋转的轴都被限制在过原点这一前提下,如果旋转轴并不过原点的话,得先把轴平移到过原点,随后再旋转,旋转结束后再平移到原来的位置。任何复杂的变换都可以分解为数个简单变换的合成。
错切
沿着 X 轴切变
即描述从(x, y, z) 到 (x + my + nz, y, z) —— m, n参考二维的正切,根据选择的角度不同所采用的三角函数也不同
$$
\begin{pmatrix}
a_{11} & a_{12} & a_{13} & a_{14} \
a_{21} & a_{22} & a_{23} & a_{24} \
a_{31} & a_{32} & a_{33} & a_{34} \
a_{41} & a_{42} & a_{43} & a_{44} \
\end{pmatrix}
\begin{pmatrix}
x \
y \
z \
1
\end{pmatrix}
=
\begin{pmatrix}
x + my + nz \
y \
z \
1
\end{pmatrix}
$$
解得
$$
\begin{pmatrix}
1 & m & n & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix}
$$
沿着 Y 轴切变
描述点 (x, y, z) 到点 (x, y + mx + nz, z)
求解就跳过了,相信聪明的大家一定看出来了行列项代表的意思了
$$
\begin{pmatrix}
1 & 0 & 0 & 0 \\
m & 1 & n & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix}
$$
沿着 Z 轴切变
描述点 (x, y, z) 到点 (x, y, z + mx + ny)
$$
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
m & n & 1 & 0 \\
0 & 0 & 0 & 1 \\
\end{pmatrix}
$$