Matrix and Transform Conversion 1/3
最近折騰很久關於坐標系轉換的一些問題,零零碎碎記了不少筆記,趁著放假整理個脈絡出來,一者方便自己以後翻閱,二者把一些經驗分享給大家。
註:個別辭彙不好用中文描述,故直接用英文
矩陣的兩種語義
引擎中矩陣無外乎表示旋轉、平移以及縮放,基礎的東西就不說了,該部分主要討論矩陣的兩種描述形式。
舉個例子,假若有一矩陣:
熟悉公式的應該很快就能看出來,該矩陣幾何意義是繞x軸旋轉+90度(準確來說是在右手坐標系下從x軸正方向看逆時針旋轉90度,後文具體說明)。
換種方式看矩陣,該矩陣可以理解為一組基坐標。以行矩陣為例,第一行{1, 0, 0}為x軸,第二行{0, 0, -1}為y軸,第三行{0, 1, 0}為z軸。該矩陣的幾何意義為子空間在父空間中的表達。
再舉一例:
如上圖所示,從數值上看,x和y都是相對於父坐標系,橙色坐標系可以表示為矩陣:
以上,可以看出。矩陣既可以理解為過程量(具體解釋為旋轉x度,縮放x倍等),也可以理解為狀態量(具體解釋為空間b在空間a的表達),兩者從數值上來說是完全等價的,但從語義上來說天差地別,最好在一開始就嚴格區分兩種語義,不然可能會造成理解上的歧義。
綜上,結論如下:
- 當矩陣被描述旋轉、平移等操作時,被理解為過程量
- 當矩陣被描述Transform等坐標系時,被理解為狀態量
左右手系和旋轉
也是一個比較細節的問題,在使用歐拉角之前,需要確定歐拉角的正方向。一般來說射線逆時針旋轉的角為正角,反之為負角。這是二維空間中的定義,但在三維空間中,對於正角的定義往往會更分的更細,主要原因在於左右手坐標系。
其實區分起來也很簡單,對於右手坐標系,正角的定義滿足右手定則,以x軸為例,正角的定義為:從x軸正方向看,逆時針(y到z)旋轉的角為正角,反之為負角,具體見上圖右;對於左手坐標系,正角滿足左手定則,以x軸為例,正角的定義為:從x軸正方向看,順時針(y到z)旋轉的角為正角,反之為負角。
再來看一下矩陣,由於左手坐標系對應行矩陣,而右手坐標系對應列矩陣,所以兩者互為轉置(也可說互為逆)。
- 右手坐標系下,繞x軸旋轉+90度:
- 右手坐標系下,繞x軸旋轉-90度:
- 左手坐標系下,繞x軸旋轉+90度:
- 左手坐標系下,繞x軸旋轉-90度:
可以看出,2和3數值上是一樣的,1和4數值上也是一樣的。這和上文中的矩陣含義有著異曲同工之妙,雖然數值相同,但在語義上具有天差地別的不同,主要原因在於三維空間中,左右手系會導致觀察旋轉的方向產生差異。例如上圖右,x軸正方向其實是從右邊看yoz平面,而上圖左,x軸正方向其實是從左邊看yoz平面。
綜上,結論如下:
- 旋轉的定義需註明手系,並默認從旋轉軸正方向來定義正角與負角
Transform和旋轉
Transform一般定義為4*4的矩陣,形式如下(以行矩陣為例):
一般習慣性理解為子空間在父空間的表達(狀態量),常用於骨骼動畫,具體如下圖所示:
下面分別對Child空間和Parent空間進行旋轉,研究一下其間的差異。
左乘一旋轉矩陣R:
可見,左乘矩陣對於Translation分量並無影響,一般稱該旋轉為Child空間(或者Local空間)的旋轉,具體結果如下圖:
對照前文的公式,可以看出Transform的Rotation分量發生了改變,即繞Child空間(左手系)的x軸旋轉-90度。
右乘一旋轉矩陣R:
可見,右乘矩陣對於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)
先寫到這,後文預告:
- 坐標系變換
- 鏡像變換
推薦閱讀: