本系列文章由birdlove1987編寫,轉載請註明出處。
文章鏈接: http://blog.csdn.net/zhurui_idea/article/details/25339595
方位和角位移的基本概念
什麼是方位、角位移?
直觀的說,我們知道,物體的“方位”主要描述物體的朝向,然而,“方向”和“方位”並不完全一樣。向量有“方向”但沒有“方位”,區別在於,當一個向量指向特定方向時,可以讓向量自轉,但向量卻不會發生任何變化,因爲向量的屬性只有大小,而沒有厚度和寬度。
然而,當一個物體朝向特定的方向時,讓它和上面向量一樣自轉,我們就會發現物體的方位改變了。
從技術角度來講,這就說明在3D中,只要用兩個參數,就能用參數表示一個方向。但是,要確定一個方位,至少需要三個參數。
描述物體的方位時,不能使用絕對量。方位是通過於相對已知方位的旋轉來描述的。旋轉的量稱作角位移。換句話說,在數學上描述方位就等價於描述角位移。
ps:我們用矩陣和四元數來表示角位移,用歐拉角來表示方位。
方位表示
矩陣形式
3D中,描述座標系中方位的一種方法就是列出這個座標系的基向量,這些基向量是用其他的座標系來描述的。用這些基向量構成一個3x3矩陣,然後就能用矩陣形式來描述方位。也就是說,能用一個旋轉矩陣來描述兩個座標系之間的相對方位,然後用這個旋轉矩陣把一個座標系中的向量轉換到另一個座標系中。
矩陣形式的優點:
1.可以立即進行向量的旋轉。
2.矩陣的形式被圖形API所用。
3.多個角位移連接。
矩陣形式的缺點:
1.矩陣佔用更多的內存。
2.難於使用,不太直觀。
3.矩陣可能是病態的(數據冗餘)
四元數表示
四元數的“差”被定義爲一個方位到另一個方位的角位移。ps:上篇筆記中詳細的記錄的四元數的相關性質,這裏就不在過多說明了。
四元數表示的優點:
1.平滑插值。
2.快速連接和角位移求逆。
3.能和矩陣形式快速轉換。
4.僅有四個數,節省空間。
四元數表示的缺點:
1.比歐拉角稍微大一些。
2.四元數可能不合法。
3.難於使用。
歐拉角
歷史淵源:歐拉角著名的數學家Leonhard Euler的名字命名,他證明了角位移序列等價於單個角位移。
歐拉角的基本思想是將角位移分解爲繞三個相互垂直軸的三個旋轉組成的序列。任意的三個軸和任意的序列都可以,但最有意義的是使用笛卡爾座標系並按一定順序所組成的旋轉序列。
歐拉角表示角位移的優點:
1.歐拉角對我們來說很容易使用。
2.最簡潔的表達方式。
3.任意三個數都是合法的。
歐拉角表示角位移的缺點:
1.給定的表達方式不唯一(旋轉序列不唯一導致)。
2.兩個角度間求插值非常困難。
各方法比較
任務/性質 | 矩陣 | 歐拉角 | 四元數 |
在座標系間旋轉點 | 能 | 不能(必須轉換到矩陣) | 不能(必須轉換到矩陣) |
連接或增量旋轉 | 能,但比四元數慢,會有矩陣蠕變 | 不能 | 能,比矩陣塊 |
插值 | 基本上不能 | 能,但可能遭遇萬向鎖 | Slerp提供了平滑插值 |
易用程度 | 難 | 易 | 難 |
在內存或文件中的存儲 | 9個數 | 3個數 | 4個數 |
對給定方位的表達式方式是否唯一 | 唯一 | 不唯一,對同意方位有無數種表示方法 | 不唯一,有兩種表示方法,相互爲負 |
可能導致非法 | 矩陣蠕變 | 任意三個數構成合法地歐拉角 | 可能出現差積累,從而產生非法的四元數 |
不同方位表示方法的建議:
1.歐拉角最容易使用。
2.如果需要在座標系之間轉換向量,那麼就選擇矩陣形式。
3.當需要大量保持方位數據時,就使用歐拉角或四元數。
4.平滑插值只能用四元數來完成。
-End-
參考文獻: (1)《3D Math Primer for Graphics and Game Development》
(2) 維基百科