任何矩陣都可以分解為旋轉、縮放、旋轉三個相乘的矩陣(查閱線性代數):

 M = R_1scale(delta_1,delta_2,delta_3)R_2

它的逆很容易求出(旋轉矩陣為正交陣,它的逆就是它的轉置):

M = R_2^Tscale(1/delta_1,1/delta_2,1/delta_3)R_1^T

平移矩陣的逆

用幾何的方式來看,我們平移變換就是把它移動 (T_x, T_y, T_z) ,那麼逆就是把它反向移,也就是 (-T_x, -T_y, -T_z) :

 T =   egin{pmatrix}  1 & 0 & 0 & T_x \  0 & 1 & 0 & T_y\  0 & 0 & 1 & T_z\  0 & 0 & 0 & 1 end{pmatrix}

逆:

T^{-1} =  egin{pmatrix}  1 & 0 & 0 & -T_x \  0 & 1 & 0 & -T_y\  0 & 0 & 1 & -T_z\  0 & 0 & 0 & 1 end{pmatrix}

縮放矩陣的逆

同樣用幾何的方式來看,縮放放大 (S_x, S_y, S_z) ,所以我們縮小回去,也就是 (1/S_x, 1/S_y, 1/S_z) :

S = egin{pmatrix}  S_x & 0 & 0 & 0 \  0 & S_y & 0 & 0 \  0 & 0 & S_z & 0 \  0 & 0 & 0 & 1 end{pmatrix}

逆:

S^{-1} = egin{pmatrix}  1/S_x & 0 & 0 & 0 \  0 & 1/S_y & 0 & 0 \  0 & 0 & 1/S_z & 0 \  0 & 0 & 0 & 1 end{pmatrix}

旋轉矩陣的逆

旋轉矩陣有特殊的性質,它是一個正交矩陣,它的逆剛好是它的轉置:

 R =  egin{pmatrix}  A & B & C & 0 \  D & E & F & 0\  G & H & I & 0\  0 & 0 & 0 & 1 end{pmatrix}

逆就是它的轉置:

 R^{-1} =  egin{pmatrix}  A & D & G & 0 \  B & E & H & 0\  C & F & I & 0\  0 & 0 & 0 & 1 end{pmatrix}

坐標變換

坐標變換的意思是,比如我們看一個點P,它在xy系統中的表示是 (x_P, y_P) ,它在uv系統中的坐標是 (u_p, v_p) , uv 在xy坐標系中是 (x_u,y_u),(x_v,y_v) ,因為在它本身坐標系中是(1,0)和(0,1).

 egin{pmatrix}  x_p \  y_p \  1 end{pmatrix} = egin{pmatrix}  1 & 0 & x_e\  0 & 1 & y_e \  0 & 0 & 1 end{pmatrix}  egin{pmatrix}  x_u & x_v & 0\  y_u & u_v & 0\  0 & 0 & 1 end{pmatrix} egin{pmatrix}  u_p \  v_p \  1 end{pmatrix}

逆變換:

egin{pmatrix}  u_p \  v_p \  1 end{pmatrix} = egin{pmatrix}  x_u & y_u & 0\  x_v & y_v & 0\  0 & 0 & 1 end{pmatrix} egin{pmatrix}  1 & 0 & -x_e\  0 & 1 & -y_e \  0 & 0 & 1 end{pmatrix} egin{pmatrix}  x_p \  y_p \  1 end{pmatrix}

三維坐標系也是一樣,同時這也給出了我們坐標變換的公式:

egin{pmatrix}  x_p \  y_p \  z_p \  1 end{pmatrix} = egin{pmatrix}  1 & 0 & 0 &  x_e\  0 & 1 & 0 & y_e \  0 & 0 & 1 & z_e \  0 & 0 & 0 & 1 end{pmatrix}  egin{pmatrix}  x_u & x_v & x_w & 0 \  y_u & y_v & y_w & 0 \  z_u & z_v & z_w & 0 \  0 & 0 & 0 & 1 end{pmatrix} egin{pmatrix}  u_p \  v_p \  w_p \  1 end{pmatrix}

逆變換:

egin{pmatrix}  u_p \  v_p \  w_p \  1 end{pmatrix} = egin{pmatrix}  x_u & y_u & z_u & 0 \  x_v & y_v & z_v & 0 \  x_w & y_w & z_w & 0 \  0 & 0 & 0 & 1 end{pmatrix} egin{pmatrix}  1 & 0 & 0 & -x_e\  0 & 1 & 0 & -y_e \  0 & 0 & 1 & -z_e \  0 & 0 & 0 & 1 end{pmatrix} egin{pmatrix}  x_p \  y_p \  z_p \  1 end{pmatrix}

這就是坐標變換,讓我們可以把一個點從一個坐標系變到另一個坐標系。

窗口變換

變換矩陣經常需要把 [a,A] x [b, B] 矩形範圍變換到 [c, C] x [d, D]。我們可以採取以下的操作:

  • 平移(a,b)移動到原點
  • 縮放矩形,達到目標矩形的大小
  • 原點移動到 (c,d)

 egin{align} window &= translate(c,d) scale(frac{C-c}{A-a}, frac{D-d}{B-b}) translate(-a,-b) \ &= egin{pmatrix}  1 & 0 & c\  0 & 1 & d\  0 & 0 & 1  end{pmatrix} egin{pmatrix}  frac{C-c}{A-a} & 0 & 0\  0 & frac{D-d}{B-b} & 0\  0 & 0 & 1  end{pmatrix} egin{pmatrix}  1 & 0 & -a\  0 & 1 & -b\  0 & 0 & 1  end{pmatrix} \ &=  egin{pmatrix}  frac{C-c}{A-a} & 0 & frac{cA-Ca}{A-a}\  0 & frac{D-d}{B-b} & frac{dB-Db}{B-b}\  0 & 0 & 1  end{pmatrix} end{align}

思考方式是通用的,然後這種思考方式感覺去做別的變換也都是可以『拿來主義』。


推薦閱讀:
相关文章