浏览量:332

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为:

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

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 ux轴方向相同;
  2. 绕着x轴旋转{\theta _3}度,即{R_x}(\theta )
  3. 与第i步相反的旋转变换,使得轴\vec u恢复到最初方向。

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

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

把等式(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),可以计算出旋转的角度为

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

\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