Matrix and Transform Conversion 1/3

最近折騰很久關於坐標系轉換的一些問題,零零碎碎記了不少筆記,趁著放假整理個脈絡出來,一者方便自己以後翻閱,二者把一些經驗分享給大家。

註:個別辭彙不好用中文描述,故直接用英文

矩陣的兩種語義

引擎中矩陣無外乎表示旋轉、平移以及縮放,基礎的東西就不說了,該部分主要討論矩陣的兩種描述形式。

舉個例子,假若有一矩陣:

 left { egin {matrix} 1 & 0 & 0 \ 0 & 0 & -1 \ 0 & 1 & 0 end {matrix} 
ight} = left { egin {matrix} 1 & 0 & 0 \ 0 & cos(90) & -sin(90) \ 0 & sin(90) & cos(90) end {matrix} 
ight}

熟悉公式的應該很快就能看出來,該矩陣幾何意義是繞x軸旋轉+90度(準確來說是在右手坐標系下從x軸正方向看逆時針旋轉90度,後文具體說明)。

換種方式看矩陣,該矩陣可以理解為一組基坐標。以行矩陣為例,第一行{1, 0, 0}為x軸,第二行{0, 0, -1}為y軸,第三行{0, 1, 0}為z軸。該矩陣的幾何意義為子空間在父空間中的表達。

再舉一例:

灰色為父空間的坐標系,橙色為子空間的坐標系

如上圖所示,從數值上看,x和y都是相對於父坐標系,橙色坐標系可以表示為矩陣:

 left { egin {matrix} x_X & x_Y \ y_X & y_Y end {matrix} 
ight}

以上,可以看出。矩陣既可以理解為過程量(具體解釋為旋轉x度,縮放x倍等),也可以理解為狀態量(具體解釋為空間b在空間a的表達),兩者從數值上來說是完全等價的,但從語義上來說天差地別,最好在一開始就嚴格區分兩種語義,不然可能會造成理解上的歧義。

綜上,結論如下:

  • 當矩陣被描述旋轉、平移等操作時,被理解為過程量
  • 當矩陣被描述Transform等坐標系時,被理解為狀態量

左右手系和旋轉

也是一個比較細節的問題,在使用歐拉角之前,需要確定歐拉角的正方向。一般來說射線逆時針旋轉的角為正角,反之為負角。這是二維空間中的定義,但在三維空間中,對於正角的定義往往會更分的更細,主要原因在於左右手坐標系。

左為左手坐標系,右為右手坐標系

其實區分起來也很簡單,對於右手坐標系,正角的定義滿足右手定則,以x軸為例,正角的定義為:從x軸正方向看,逆時針(y到z)旋轉的角為正角,反之為負角,具體見上圖右;對於左手坐標系,正角滿足左手定則,以x軸為例,正角的定義為:從x軸正方向看,順時針(y到z)旋轉的角為正角,反之為負角。

再來看一下矩陣,由於左手坐標系對應行矩陣,而右手坐標系對應列矩陣,所以兩者互為轉置(也可說互為逆)。

  1. 右手坐標系下,繞x軸旋轉+90度:  left { egin {matrix} 1 & 0 & 0 \ 0 & cos(90) & -sin(90) \ 0 & sin(90) & cos(90) end {matrix} 
ight} = left { egin {matrix} 1 & 0 & 0 \ 0 & 0 & -1 \ 0 & 1 & 0 end {matrix} 
ight}
  2. 右手坐標系下,繞x軸旋轉-90度:  left { egin {matrix} 1 & 0 & 0 \ 0 & cos(-90) & -sin(-90) \ 0 & sin(-90) & cos(-90) end {matrix} 
ight} = left { egin {matrix} 1 & 0 & 0 \ 0 & 0 & 1 \ 0 & -1 & 0 end {matrix} 
ight}
  3. 左手坐標系下,繞x軸旋轉+90度:  left { egin {matrix} 1 & 0 & 0 \ 0 & cos(90) & sin(90) \ 0 & -sin(90) & cos(90) end {matrix} 
ight} = left { egin {matrix} 1 & 0 & 0 \ 0 & 0 & 1 \ 0 & -1 & 0 end {matrix} 
ight}
  4. 左手坐標系下,繞x軸旋轉-90度:  left { egin {matrix} 1 & 0 & 0 \ 0 & cos(-90) & sin(-90) \ 0 & -sin(-90) & cos(-90) end {matrix} 
ight} = left { egin {matrix} 1 & 0 & 0 \ 0 & 0 & -1 \ 0 & 1 & 0 end {matrix} 
ight}

可以看出,2和3數值上是一樣的,1和4數值上也是一樣的。這和上文中的矩陣含義有著異曲同工之妙,雖然數值相同,但在語義上具有天差地別的不同,主要原因在於三維空間中,左右手系會導致觀察旋轉的方向產生差異。例如上圖右,x軸正方向其實是從右邊看yoz平面,而上圖左,x軸正方向其實是從左邊看yoz平面。

綜上,結論如下:

  • 旋轉的定義需註明手系,並默認從旋轉軸正方向來定義正角與負角

Transform和旋轉

Transform一般定義為4*4的矩陣,形式如下(以行矩陣為例):

T = left { egin {matrix} x_x & x_y & x_z & 0 \ y_x & y_y & y_z & 0 \ z_x & z_y & z_z & 0 \ t_x & t_y & t_z & 1 end {matrix} 
ight}

一般習慣性理解為子空間在父空間的表達(狀態量),常用於骨骼動畫,具體如下圖所示:

灰色為父空間的坐標系,橙色為子空間的坐標系

下面分別對Child空間和Parent空間進行旋轉,研究一下其間的差異。

左乘一旋轉矩陣R:  left { egin {matrix} 1 & 0 & 0 & 0\ 0 & 0 & -1 & 0\ 0 & 1 & 0 & 0\ 0 & 0 & 0 & 1 end {matrix} 
ight} 	imes left { egin {matrix} x_x & x_y & x_z & 0 \ y_x & y_y & y_z & 0 \ z_x & z_y & z_z & 0 \ t_x & t_y & t_z & 1 end {matrix} 
ight} = left { egin {matrix} x_x & x_y & x_z & 0 \ -z_x & -z_y & -z_z & 0 \ y_x & y_y & y_z & 0 \ t_x & t_y & t_z & 1 end {matrix} 
ight}

可見,左乘矩陣對於Translation分量並無影響,一般稱該旋轉為Child空間(或者Local空間)的旋轉,具體結果如下圖:

灰色為父空間的坐標系,橙色為子空間的坐標系

對照前文的公式,可以看出Transform的Rotation分量發生了改變,即繞Child空間(左手系)的x軸旋轉-90度。

右乘一旋轉矩陣R:  left { egin {matrix} x_x & x_y & x_z & 0 \ y_x & y_y & y_z & 0 \ z_x & z_y & z_z & 0 \ t_x & t_y & t_z & 1 end {matrix} 
ight} 	imes left { egin {matrix} 1 & 0 & 0 & 0\ 0 & 0 & -1 & 0\ 0 & 1 & 0 & 0\ 0 & 0 & 0 & 1 end {matrix} 
ight} = left { egin {matrix} x_x & -x_z & x_y & 0 \ y_x & -y_z & y_y & 0 \ z_x & -z_z & z_y & 0 \ t_x & -t_z & t_y & 1 end {matrix} 
ight}

可見,右乘矩陣對於Translation分量產生了影響,一般稱該旋轉為Parent空間的旋轉,具體結果如下圖:

灰色為父空間的坐標系,橙色為子空間的坐標系

對照前文的公式,可以看出Transform的Rotation分量和Translation分量都發生了改變,即繞Parent空間(左手系)的x軸旋轉-90度。

綜上,結論如下:

  • 對於行矩陣,左乘矩陣等效於對Child空間進行線性變換
  • 對於行矩陣,右乘矩陣等效於對Parent空間進行線性變換

旋轉的兩種語義

優先假設某一坐標系下有一頂點,如下圖:

左手坐標系

對頂點繞x軸順時針旋轉90度,可以理解下面兩個操作:

  • 對頂點直接旋轉(坐標系固定不動):

左手坐標系

  • 對頂點所處的Local坐標系進行旋轉(頂點固定不動):

左手坐標系

由圖可知,兩者從數值上來說都是從{0, 1, 0}轉換成了{0, 0, 1},但從語義上兩者一個是針對物體,一個是針對坐標系。下面結合Transform,具體說說兩種語義在具體問題中的應用。

Transform本身即狀態量,表示Child空間的坐標系在Parent空間中的表達,其中包含Rotation分量和Translation分量,所以Transform可以看作是Parent空間中的物體。

本文上一節分別對Transform左乘和右乘同一個旋轉矩陣(繞x軸旋轉-90度)。

左乘的結果:Child空間的坐標系量系繞Child空間(左手系)的x軸旋轉-90度。

右乘的結果:Transform整體繞Parent空間(左手系)的x軸旋轉-90度,換種角度思考,其實可以認為是Parent空間的坐標系繞Parent空間(左手系)的x軸旋轉+90度,具體如下圖:

灰色為父空間的坐標系,橙色為子空間的坐標系

綜上,結論如下:

  • 對於矩陣M,左乘矩陣等效於對Child空間的坐標系進行變換(M)
  • 對於矩陣M,右乘矩陣等效於對Parent空間的坐標系進行逆變換(Inverse M)

先寫到這,後文預告:

  1. 坐標系變換
  2. 鏡像變換

推薦閱讀:

TAG:計算機圖形學 | 遊戲引擎 | 矩陣 |