二维平移旋转变换及其特性

本文主要内容

  • 平移变换矩阵
  • 绕原点旋转变换矩阵
  • 绕任意点旋转变换矩阵
  • 刚体变换矩阵特性
  • 构造旋转矩阵

平移矩阵

假设延x轴平移 t x t_x tx,延y轴平移 t y t_y ty距离,显然:
x ′ = x + t x x' = x + t_x x=x+tx
y ′ = y + t y y' = y + t_y y=y+ty
用齐次坐标矩阵表示为:
[ x ′ y ′ 1 ] = [ 1 0 t x 0 1 t y 0 0 1 ] ∗ [ x y 1 ] \left[\begin{matrix} x' \\ y' \\ 1 \\ \end{matrix}\right] = \left[\begin{matrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \\ \end{matrix}\right] * \left[\begin{matrix} x \\ y \\ 1 \\ \end{matrix}\right] xy1=100010txty1xy1
所以,平移矩阵:
T ( t x , t y ) = [ 1 0 t x 0 1 t y 0 0 1 ] T(t_x, t_y) = \left[\begin{matrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \\ \end{matrix}\right] T(tx,ty)=100010txty1

基本旋转矩阵(绕原点)

二维平移旋转变换及其特性_第1张图片
显然,有三角关系:
x ′ = r ∗ c o s ( θ + α ) = r ∗ c o s θ ∗ c o s α − r ∗ s i n θ ∗ s i n α x' = r * cos(\theta + \alpha) = r * cos\theta * cos\alpha - r * sin\theta * sin\alpha x=rcos(θ+α)=rcosθcosαrsinθsinα
y ′ = r ∗ s i n ( θ + α ) = r ∗ s i n θ ∗ c o s α + r ∗ c o s θ ∗ c o s α y' = r * sin(\theta + \alpha) = r * sin\theta * cos\alpha + r * cos\theta * cos\alpha y=rsin(θ+α)=rsinθcosα+rcosθcosα
又:
x = r ∗ c o s α x = r * cos\alpha x=rcosα
y = r ∗ s i n α y = r * sin\alpha y=rsinα
所以:
x ′ = x ∗ c o s θ − y ∗ s i n θ x' = x * cos\theta - y * sin\theta x=xcosθysinθ
y ′ = x ∗ s i n θ + y ∗ c o s θ y' = x * sin\theta + y * cos\theta y=xsinθ+ycosθ
用齐次坐标矩阵形式表示为:
[ x ′ y ′ 1 ] = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] ∗ [ x y 1 ] \left[\begin{matrix} x' \\ y' \\ 1 \\ \end{matrix}\right] = \left[\begin{matrix} cos\theta&-sin\theta & 0 \\ sin\theta&cos\theta & 0 \\ 0 & 0 & 1 \\ \end{matrix}\right] * \left[\begin{matrix} x \\ y \\ 1 \\ \end{matrix}\right] xy1=cosθsinθ0sinθcosθ0001xy1
所以,旋转矩阵:
R ( θ ) = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] R(\theta) = \left[\begin{matrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0\\ 0 & 0 & 1 \\ \end{matrix}\right] R(θ)=cosθsinθ0sinθcosθ0001

旋转矩阵(绕任意点)

绕任意点P( x p x_p xp, y p y_p yp)旋转时,我们可以将旋转变换分解成如下几个步骤:

  • 将坐标系原点平移至P点,相当于原图形延x轴平移 − x p -x_p xp距离,延y轴平移 − y p -y_p yp的距离,即有平移矩阵:
    T ( − x p , − y p ) = [ 1 0 − t x 0 1 − t y 0 0 1 ] T(-x_p, -y_p) = \left[\begin{matrix} 1 & 0 & -t_x \\ 0 & 1 & -t_y \\ 0 & 0 & 1 \\ \end{matrix}\right] T(xp,yp)=100010txty1
  • 再将对象绕原点旋转 θ \theta θ角度:
    R ( θ ) = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] R(\theta) = \left[\begin{matrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0\\ 0 & 0 & 1 \\ \end{matrix}\right] R(θ)=cosθsinθ0sinθcosθ0001
  • 不要忘了再把坐标系还原:
    T ( x p , y p ) = [ 1 0 t x 0 1 t y 0 0 1 ] T(x_p, y_p) = \left[\begin{matrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \\ \end{matrix}\right] T(xp,yp)=100010txty1
    所以,最后绕任意点的旋转矩阵为(注意矩阵相乘顺序):
    R ( t x , t y , θ ) = T ( x p , y p ) ∗ R ( θ ) ∗ T ( − x p , − y p ) = [ c o s θ − s i n θ t x ( 1 − c o s θ ) + t y ∗ s i n θ s i n θ c o s θ t y ( 1 − c o s θ ) − t x ∗ s i n θ 0 0 1 ] R(t_x, t_y, \theta) = T(x_p, y_p) * R(\theta) * T(-x_p, -y_p) = \left[\begin{matrix} cos\theta & -sin\theta & t_x(1 - cos\theta) + t_y * sin\theta \\ sin\theta & cos\theta & t_y(1 - cos\theta) - t_x * sin\theta\\ 0 & 0 & 1 \\ \end{matrix}\right] R(tx,ty,θ)=T(xp,yp)R(θ)T(xp,yp)=cosθsinθ0sinθcosθ0tx(1cosθ)+tysinθty(1cosθ)txsinθ1

刚体变换特性

如果一个变换仅包含平移和旋转,那么它就可称为刚体变换,其相应的变换矩阵为刚体变换矩阵,可用下列矩阵表示:
R b = [ r x x r x y t r x r y x r y y t r y 0 0 1 ] R_b = \left[\begin{matrix} r_{xx} & r_{xy} & tr_x \\ r_{yx} & r_{yy} & tr_y\\ 0 & 0 & 1 \\ \end{matrix}\right] Rb=rxxryx0rxyryy0trxtry1
该矩阵有下性质:其左上角2X2矩阵是一个正交矩阵,也就是说:

  • 任意行或列均为单位向量,即 r x x 2 + r x y 2 = r y x 2 + r y y 2 = 1 r_{xx}^2 + r_{xy}^2 = r_{yx}^2 + r_{yy}^2 =1 rxx2+rxy2=ryx2+ryy2=1
  • 行或列之间正交,即 r x x ∗ r y x + r x y ∗ r y y = 0 r_{xx} * r_{yx} + r_{xy} * r_{yy} = 0 rxxryx+rxyryy=0
  • 假如这些单位向量通过该旋转子矩阵进行变换,那么( r x x , r x y r_{xx}, r_{xy} rxx,rxy)就旋转成延x轴的单位向量,( r y x , r y y r_{yx}, r_{yy} ryx,ryy)就旋转成了延y轴的单位向量:
    [ r x x r x y 0 r y x r y y 0 0 0 1 ] ∗ [ r x x r x y 0 ] = [ 1 0 0 ] \left[\begin{matrix} r_{xx} & r_{xy} & 0 \\ r_{yx} & r_{yy} & 0\\ 0 & 0 & 1 \\ \end{matrix}\right] * \left[\begin{matrix} r_{xx} \\ r_{xy} \\ 0 \\ \end{matrix}\right] = \left[\begin{matrix} 1 \\ 0 \\ 0 \\ \end{matrix}\right] rxxryx0rxyryy0001rxxrxy0=100
    [ r x x r x y 0 r y x r y y 0 0 0 1 ] ∗ [ r y x r y y 0 ] = [ 0 1 0 ] \left[\begin{matrix} r_{xx} & r_{xy} & 0 \\ r_{yx} & r_{yy} & 0\\ 0 & 0 & 1 \\ \end{matrix}\right] * \left[\begin{matrix} r_{yx} \\ r_{yy} \\ 0 \\ \end{matrix}\right] = \left[\begin{matrix} 0 \\ 1 \\ 0 \\ \end{matrix}\right] rxxryx0rxyryy0001ryxryy0=010

用途

二维平移旋转变换及其特性_第2张图片
在只知道对象最后的方位而不知道旋转角度时,可以利用上述性质构造旋转矩阵。比如,我们希望将一个对象旋转至与观察方向对称的轴对齐,如下图所示,假设原始对象与坐标轴对齐, u ′ = ( u x , u y ) u' = (u_x, u_y) u=(ux,uy) v ′ = ( v x , v y ) v' = (v_x, v_y) v=(vx,vy)为单位向量,那么旋转矩阵可以构造为:
[ u x u y 0 v x v y 0 0 0 1 ] \left[\begin{matrix} u_x & u_y & 0 \\ v_x & v_y & 0\\ 0 & 0 & 1 \\ \end{matrix}\right] uxvx0uyvy0001

个人觉得可以按如下理解:

将图形由(a)位置旋转至(b)位置,相当于将坐标系(u’, v’)旋转至坐标系(x, y),而刚体变换性质第三点(如上)正好对应该变换。

你可能感兴趣的:(#,OpenGL,Math,Related)