浏览量:317

1.4. 图形变换

 

本篇文章禁止用于任何商业目的,版权申明、版本说明等见《前言》。

PDF文档和源码下载地址:https://github.com/twinklingstar20/Programmers_Computational_Geometry

1.4. 图形变换

图形变换包括平移、旋转、缩放、错切、正交变换等,由于本书的特点,这里只介绍其中最简单的平移、旋转、缩放变换,这几种变换都是仿射变换,所谓的仿射变换就是指两条互相平行的直线,经过变换后,仍能够保持平行特性的变换。在图形学中,齐次表示占有非常重要的位置,点表示空间上的一个位置,向量表示一个方向而没有具体的位置,因此点的位移是有意义的,但是向量的位移是没有意义的。在\(n\)维空间上,把点和向量扩展一维,就是它们的齐次表示,点\(P\)的齐次表示为\(({p_1},{p_2}, \cdots ,{p_n},1)\),向量\(\vec v\)的齐次表示为\(({v_1},{v_2}, \cdots ,{v_n},0)\)。采用齐次表示,三维空间上的图形变换包括旋转、位移等都可以用一个\(4 \times 4\)的矩阵来表示,矩阵的连乘就是各个矩阵变换的叠加。

1.4.1. 平移变换

从一个位置到另一个位置的变化,可以用平移矩阵\({T_n}\)表示,其中,\(n\)表示维度,\(n\)取2或者3。平移矩阵可以表示为:

\begin{eqnarray*}
{T_n} = \left( {\begin{array}{*{20}{l}}1&0& \cdots &0&{{t_1}}\\0&1& \cdots &0&{{t_2}}\\ \vdots & \vdots & \ddots & \vdots & \vdots \\0&0& \cdots &1&{{t_n}}\\0&0& \cdots &0&1\end{array}} \right)
\tag{1.34}
\end{eqnarray*}

\(n\)维空间上的平移变换矩阵是一个\(n \times n\)的矩阵。对一个点\(P = {({p_1},{p_2}, \cdots ,{p_n},1)^T}\)进行平移变换,得到新的点\(P' = {T_n} \cdot P = ({p_1} + {t_1},{p_2} + {t_2}, \cdots ,{p_n} + {t_n})\);对一个向量\(\vec v = {({v_1},{v_2}, \cdots ,{v_n},0)^T}\)进行平移变换后,仍然得到向量\(\vec v\),向量并没有受到任何影响。

1.4.2. 旋转变换

旋转变换可以用矩阵、欧拉角或者四元数表示,这里只考虑矩阵表示法。

在二维空间上,绕着原点,沿着逆时针方向旋转\(\theta \)角,可以用\(3 \times 3\)的矩阵表示为

\begin{eqnarray*}
R(\theta ) = \left( {\begin{array}{*{20}{c}}{\cos \theta }&{ - \sin \theta }&0\\{\sin \theta }&{\cos \theta }&0\\0&0&1\end{array}} \right)
\tag{1.35}
\end{eqnarray*}

在三维空间上,绕着\(x\)轴、\(y\)轴、\(z\)轴的旋转分别用\(4 \times 4\)的矩阵\({R_x}(\theta ),{R_y}(\theta ),{R_z}(\theta )\)表示,有

2015-3-21 22-42-00

其中,沿着轴相反的方向观察,\(\theta \)表示逆时针旋转的角度。

如果希望三维空间上的物体能绕着\(z\)轴旋转\(\theta \)度,旋转中心的齐次表示为\(p\),那么该如何进行变换呢[2]?由于采用矩阵形式的变换,可以用矩阵的乘积来叠加。首先,应该进行平移变换,使\(p\)点与原点重合,这一过程可以用\({T_3} \cdot {p^T}\)表示;然后,进行旋转变换\({R_z}(\theta )\);最后,再进行位移变换,返回至物体原先坐标。总的变换矩阵用\(H\)表示,则可以用\(H \cdot {p^T}\)表示变换后的点,\(H\)为:

\[H = {T_3}(t){R_z}(\theta ){T_3}( - t) \tag{1.37}\]

2015-3-21 22-31-01

图1.11 绕着指定点的旋转[3]

在三维空间上,物体绕着任意一条轴旋转\(\theta \)度可以用\(4 \times 4\)的旋转矩阵\(R\)表示[3]。任意一个绕着指定点的旋转都可以表示成绕着经过该点的轴的旋转,如图1.11所示,考虑绕着点\(Q\)的旋转,任意一个点\(P\)经过旋转变换后,得到新的点\(P'\)。我们可以把这样的旋转分解为几个步骤:

  1. 把轴\(\vec u\)进行两次旋转变换,即\({R_y}({\theta _1})\)\({R_z}( - {\theta _2})\),使得轴\(\vec u\)\(x\)轴方向相同;
  2. 绕着\(x\)轴旋转\({\theta _3}\)度,即\({R_x}(\theta )\)
  3. 与第\(i\)步相反的旋转变换,使得轴\(\vec u\)恢复到最初方向。

组合上述5个旋转变换,总的变换可以表示为

\[R(\theta ) = {R_y}( - {\theta _1}){R_z}({\theta _2}){R_x}(\theta ){R_z}( - {\theta _2}){R_y}({\theta _1}) \tag{1.38}\]

把等式(1.36)中的变换等式代入(1.38)中,可以得到总的变换等式

\begin{eqnarray*}
R(\theta ) = \left( {\begin{array}{*{20}{c}}{c + (1 - c)u_x^2}&{(1 - c){u_y}{u_x} - s{u_z}}&{(1 - c){u_z}{u_x} + s{u_y}}&0\\{(1 - c){u_x}{u_y} + s{u_z}}&{c + (1 - c)u_y^2}&{(1 - c){u_z}{u_y} - s{u_x}}&0\\{(1 - c){u_x}{u_z} - s{u_y}}&{(1 - c){u_y}{u_z} + s{u_x}}&{c + (1 - c)u_z^2}&0\\0&0&0&1\end{array}} \right)
\tag{1.39}
\end{eqnarray*}

其中,\(c = \cos \theta ,s = \sin \theta ,\vec u = ({u_x},{u_y},{u_z})\)

相反,若给定一个旋转矩阵\(R(\theta )\),我们也可以求出它是绕着哪条轴旋转多少度角?设

\[R(\theta ) = \left( {\begin{array}{*{20}{c}}{{m_{11}}}&{{m_{12}}}&{{m_{13}}}&0\\{{m_{21}}}&{{m_{22}}}&{{m_{23}}}&0\\{{m_{31}}}&{{m_{32}}}&{{m_{33}}}&0\\0&0&0&1\end{array}} \right)\]

由等式(1.39),可以计算出旋转的角度为

\[\theta = \arccos \frac{{{m_{11}} + {m_{22}} + {m_{33}} - 1}}{2} \tag{1.40}\]

\(\vec u\)三个方向的分量为

\begin{eqnarray*}
\begin{array}{l}{u_x} = \frac{{{m_{32}} - {m_{23}}}}{{2\sin \theta }}\\{u_y} = \frac{{{m_{13}} - {m_{31}}}}{{2\sin \theta }}\\{u_z} = \frac{{{m_{21}} - {m_{12}}}}{{2\sin \theta }}\end{array}
\tag{1.41}
\end{eqnarray*}

旋转矩阵\(R\)有三个重要的性质:

  1. \({R^{ - 1}} = {R^T}\);
  2.  \(R \cdot \vec u = \vec u\);
  3. \(\left| R \right| = 1\)

1.4.3. 缩放变换

缩放变换可以使得物体在指定方向上发生缩放变化,缩放矩阵用\({S_n}\)表示,其中,\(n\)表示维度,\(n\)取2或者3,缩放矩阵可以表示为

\begin{eqnarray*}
{S_n} = \left( {\begin{array}{*{20}{l}}{{s_1}}&0& \cdots &0&0\\0&{{s_2}}& \cdots &0&0\\ \vdots & \vdots & \ddots & \vdots & \vdots \\0&0& \cdots &{{s_n}}&0\\0&0& \cdots &0&1\end{array}} \right)
\tag{1.42}
\end{eqnarray*}

缩放矩阵的逆矩阵可以表示为

\begin{eqnarray*}
S_n^{ - 1} = \left( {\begin{array}{*{20}{l}}{1/{s_1}}&0& \cdots &0&0\\0&{1/{s_2}}& \cdots &0&0\\ \vdots & \vdots & \ddots & \vdots & \vdots \\0&0& \cdots &{1/{s_n}}&0\\0&0& \cdots &0&1\end{array}} \right)
\tag{1.43}
\end{eqnarray*}

 

spacer

One comment on “1.4. 图形变换

  1. openlib

    your course is very good. it is helpful for me. thank you.

Leave a reply