什么是线性变换?
假设有一数学函数\(f\),使得三维向量\(\vec v=(x,y,z)\),有\(f(\vec v) = f(x, y, z) = (x',y',z')\)。那么,如果\(f\)满足:
- \(f(\vec u + \vec v) = f(\vec u) + f(\vec v)\)
- \(f(k \vec v) = kf(\vec v)\)
那么,称\(f\)为线性变换。
线性变换的矩阵表示
\[\begin{align*}
f(\vec v) &= f(x \vec i + y \vec j + z \vec k) \\
&= f(x \vec i) + f(y \vec j) + f(z \vec k) \\
&= xf(\vec i) + yf(\vec j) + zf(\vec k) \\
&= [x, y, z] \cdot \begin{bmatrix} f(\vec i) \\ f(\vec j) \\ f(\vec k) \end{bmatrix}
\end{align*}
\]
缩放变换
易知,缩放变换\(S(\vec v) = S(x, y, z) = (s_x x, s_y y, s_z z)\)。那么,我们尝试证明一下它是线性变换:
\[\begin{align*}
S(\vec u + \vec v) &= S(u_x+v_x, u_y+v_y, u_z+v_z) \\
&= (s_x(u_x+v_x), s_y(u_y+v_y), s_z(u_z+v_z)) \\
&= (s_xu_x + s_xv_x, s_yu_y + s_yv_y, s_zu_z + s_zv_z) \\
&= (s_xu_x, s_yu_y, s_zu_z) + (s_xv_x, s_yv_y, s_zv_z) \\
&= S(\vec u) + S(\vec v)
\end{align*}
\]
\[\begin{align*}
S(k\vec v) &= S(kv_x, kv_y, kv_z) \\
&= (ks_xv_x, ks_yv_y, ks_zv_z) \\
&= k(s_xv_x, s_yv_y, s_zv_z) \\
&= kS(\vec v)
\end{align*}
\]
综上,我们证明了缩放变换是线性变换。由之前线性变换的矩阵表示,我们可以推导缩放变换的矩阵表示为
\[\begin{bmatrix} S(\vec i) \\ S(\vec j) \\ S(\vec k) \end{bmatrix} =
\begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & s_z \end{bmatrix}
\]
旋转变换
我们定义旋转变换为将一个向量\(\vec v\)绕任意轴\(\vec n\)顺时针旋转\(\theta\)角度,如图所示:
![](https://img2018.cnblogs.com/blog/1842322/201911/1842322-20191104002745210-1279755587.png)
由图可知,我们要求的就是将向量\(\vec v\)绕向量\(\vec n\)旋转\(\theta\)角度后得到的\(\vec v'\)。首先,我们注意到在旋转过程中,与旋转轴平行的向量是不参与旋转过程的,只有与旋转轴垂直的向量在真正旋转。因此可以将向量\(\vec v\)分解为与\(\vec n\)平行的向量\(\vec v_\parallel\)和垂直的向量\(\vec v_\perp\)。即:
\[\vec v = \vec v_\parallel + \vec v_\perp
\]
那么
\[\vec v' = \vec v_\parallel + \vec v'_\perp
\]
其中,平行向量\(\vec v_\parallel\)是向量\(\vec v\)在旋转轴\(\vec n\)上的投影。这里假定,旋转轴向量\(\vec n\)是归一化过的,即单位向量。由向量投影的定义,可得到
\[\vec v_\parallel = (\vec v \cdot \vec n) \vec n
\]
进而可得
\[\vec v_\perp = \vec v - \vec v_\parallel = \vec v - (\vec v \cdot \vec n) \vec n
\]
接下来,我们只要求得旋转后的\(\vec v'_\perp\)即可。注意到已知的\(\vec v_\perp\),且这两个向量都位于同一个圆的旋转平面上,因此只要再得到一个垂直于\(\vec v_\perp\)的向量\(\vec w\),且向量\(\vec w\)与这两个向量共面,就可以通过旋转角度\(\theta\)算出向量\(\vec v'_\perp\)了:
\[\vec v'_\perp = \vec v_\perp \cdot cos\theta + \vec w \cdot sin\theta
\]
那么,怎样的\(\vec w\)是满足以上条件的呢?注意到向量的叉积的几何意义:两向量的叉积后得到的向量与这两个向量是垂直的。所以,我们令
\[\vec w = \frac{|\vec v_\perp|}{|\vec n \times \vec v|} \cdot (\vec n \times \vec v)
\]
向量前面的系数是为了让向量的模与\(\vec v_\perp\)相等。这样就求出了满足条件的\(\vec w\)。特别地,由向量叉积的定义,可以将上式简化为
\[\vec w = \frac{|\vec v_\perp|}{|\vec n| |\vec v| sin\theta} \cdot \ (\vec n \times \vec v)
\]
由图可知,\(|\vec v_\perp| = |\vec v| sin\theta\),而向量\(\vec n\)是单位向量,所以得到:
\[\vec w = \vec n \times \vec v
\]
综合以上若干等式,求出最终的\(\vec v'\)为
\[\vec v' = (\vec v \cdot \vec n) \vec n + (\vec v - (\vec v \cdot \vec n) \vec n)cos\theta + (\vec n \times \vec v)sin\theta
\]
回到线性变换的定义来,旋转变换\(R(\vec v) = R(x, y, z)\)。将其代入上式,可以得到
\[R(x,y,z) = (r_{11}x + r_{21}y + r_{31}z, r_{12}x + r_{22}y + r_{32}z, r_{13}x + r_{23}y + r_{33}z)
\]
根据线性变换的定义,容易证明旋转变换是一种线性变换。那么,旋转变换的矩阵表示为:
\[\begin{bmatrix} R(\vec i) \\ R(\vec j) \\ R(\vec k) \end{bmatrix} =
\begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix} =
\begin{bmatrix} c + (1 - c)x^2 & (1-c)xy + sz & (1-c)xz - sy \\ (1-c)xy - sz & c+(1-c)y^2 & (1-c)yz + sx \\ (1-c)xz + sy & (1-c)yz - sx & c+(1-c)z^2 \end{bmatrix}
\]
其中,\(c=cos\theta, s = sin\theta, x,y,z\)分别为向量\(\vec n\)的三个分量。