什么是方位
直觀地說,我們知道物體的“方位”主要描述的是物體的朝向。然而“方向”和“方位”并不完全一樣。向量有“方向”但沒有“方位”,區別在于,當一個向量指向特定方向時,可以讓向量自轉(如圖10.1所示),但向量(或者說它的方向)卻不會有任何變化,因為向量的屬性只有“大小”,而沒有“厚度”和“寬度”。

然而,當一個物體朝向特定的方向時,讓它和上面的向量一樣自轉,你會發現物體的方位改變了,如圖10.2所示:

從技術角度來講,這就說明在3D中,只要用兩個數字(例如:極坐標),就能用參數表示一個方向(direction)。但是,要確定一個方位(orientation),卻至少需要需要三個數字。
我們知道不能用絕對坐標來描述物體的位置,要描述物體的位置,必須把物體放置于特定的參考系中。描述位置實際上就是描述相對于給定參考點(通常是坐標系的原點)的位移。
同樣,描述物體方位時,也不能使用絕對量。與位置只是相對已知點的位移一樣,方位是通過與相對已知方位(通常稱為"單位"方位或"源"方位)的旋轉來描述的。旋轉的量稱作角位移。換句話說,在數學上描述方位就等價于描述角位移。
"方位"和"角位移"的區別就像"點"和"向量"的區別
----
兩個術語都只是在數學上等價而在概念上是不同的。方位和點主要用來描述一個單一的狀態,而角位移和向量描述的是兩個狀態間的差別。具體來說,我們用矩陣和四元數來表示"角位移",用歐拉角來表示"
方位"。
矩陣形式
3D中,描述坐標系中方位的一種方法就是列出這個坐標系的基向量,這些基向量是用其他的坐標系來描述的。用這些基向量構成一個3x3矩陣,然后就能用矩陣形式來描述方位。換句話說,能用一個旋轉矩陣來描述這兩個坐標系之間的相對方位,這個旋轉矩陣用于把一個坐標系中的向量轉換到另外一個坐標系中,如圖10.3所示:

我們通過描述一個坐標系到另一個坐標系的旋轉(無論采用哪種變換)來確定一個方位。矩陣變換的具體方向是一個實現細節,因為旋轉矩陣是正交的,如果必要的話,只需簡單的轉置就可求得逆變換。
矩陣形式的優點
矩陣是一種非常直接的描述方位的形式,這種直接性帶來了如下優點:
(1)可以立即進行向量的旋轉。矩陣形式最重要的性質就是利用矩陣能在物體和慣性坐標系間旋轉向量,這是其他描述方位所做不到的。為了旋轉向量,必須將方位轉換成矩陣形式。
(2)矩陣形式被圖形API所采用。圖形API使用矩陣來描述方位。(API就是應用程序接口,基本上它們就是實現你和顯卡交流的代碼。)當你和圖形API交流時,最終必須用矩陣來描述所需的變換。程序中怎樣保存方位由你決定,但如果選擇了其他形式,則必須在渲染管道的某處將其轉換為矩陣。
(3)多個角位移連接。矩陣形式的第二個優點就是可以 “打破”嵌套坐標系間的關系。例如,如果知道A關于B的方位,又知道B關于C的方位,使用矩陣可以求得A關于C的方位。
(4)矩陣的逆。用矩陣形式表達角位移時,逆矩陣就是"反"
角位移。因為旋轉矩陣是正交的,所以這個計算只是簡單的矩陣轉置運算。
矩陣形式的缺點
(1)矩陣占用了更多的內存。如果需要保存大量方位,如動畫序列中的關鍵幀,9個數會導致數目可觀的額外空間損失。舉一個或許不太合適的例子,假設現在做的是一個人的模型動畫,該模型被分解為15塊。動畫的完成實際是嚴格地控制子塊和父塊之間的相對方位。假設每一幀為每一塊保存一個方位,動畫頻率是15HZ
,這意味這每秒需要保存225個方位。使用矩陣和32位浮點數,每一幀有8100字節,而使用歐拉角,同樣的數據只需2700字節。對于30s的動畫數據,矩陣就比歐拉角多占用162k字節。
(2)難以使用。矩陣對人類來說并不直觀,有太多的數,并且它們都在-1到1之間。人類考慮方位的直觀方法是角度,而矩陣使用的是向量。通過實踐,我們能從一個給定的矩陣中得到它所表示的方位。但這仍比歐拉角困難得多,其他方面也不盡如人意。用手算來構造描述任意方位的矩陣幾乎是不可能的。總之,矩陣不是人類思考方位的直觀方法。
(3)矩陣可能是病態的。矩陣使用9個數,其實只有3個數是必須的。也就是說,矩陣帶有6階冗余。描述方位的矩陣必須滿足6個限制條件。行必須是單位向量,而且它們互相垂直。
病態矩陣是怎樣出現的呢?有多種原因:
1、矩陣可能包含縮放、切變或鏡像操作,這些操作會對物體的"方位"產生什么影響呢?確實,對此沒有一個清晰的定義。任何非正交的矩陣都不是一個定義良好的旋轉矩陣。雖然鏡像矩陣也是正交的,但它不是有效的旋轉矩陣。
2、可能從外部數據源獲得"壞"數據。例如,使用物體數據獲取設備(如動作捕捉器)時,捕獲過程中可能產生錯誤。許多建模包就是因為會產生病態矩陣而變得聲名狼藉。
3、可能因為浮點數的舍入錯誤產生"壞"數據。例如,對一個方位作大量的加運算,這在允許人們手動控制物體方位的游戲中是很常見的。由于浮點精度的限制,大量的矩陣乘法最終可能導致病態矩陣,這種現象稱作"矩陣蠕變"。