【3D數學基礎:圖形與游戲開發】筆記 第10章 3D中的方位與角位移
參考資料&原文鏈接
參考書籍:【3D數學基礎:圖形與游戲開發】 ISBN7-302-10946XTP.7262
(美) etcher Dun著、(美) an Arberry 清華大學出版社
3D中的方向、方位與角位移
方向
直觀地說,我們知道,物體的“方位”主要描述的是物體的朝向。
向量有“方向”但沒有“方位”。無論如何旋轉這個向量都等於原來的向量,因為向量的屬性只有“大小”,而沒有“厚度”和“寬度”。
方位與角位移
此物體轉動的時候,“方位”發生了變化,稱為旋轉,旋轉的量稱為“角位移”。
旋轉的三種表示方法
矩陣
前面已經介紹過了,點擊這里前往。
歐拉角
歐拉角的基本思想是將角位移分解為繞三個互相垂直軸的三個旋轉組成的序列。這聽起來很復雜,其實它是非常直觀的(事實上,易於使用正是它的主要優點之一)。
本書使用“heading-pitch-bank”約定。
有些書籍也使用“yaw(偏航角)- pitch(俯仰角)- roll(翻滾角)”約定。
它們之間的對應關系是:x軸對應heading/yaw、y軸對應pitch/pitch、z軸對應bank/roll。
前面說過歐拉角的基本思想,所以歐拉角旋轉需要分三次旋轉,每次旋轉對應一個軸:
萬向鎖
關於萬向鎖,這個視頻講的很清楚,點擊前往。
這個問題容易在歐拉角插值的時候發生。
正常的時候是這樣的:
翻滾角:
俯仰角:
偏航角:
當ptich軸為±90°時,此時yaw與roll在同一平面,這時對這兩個軸施加旋轉都不會真正的讓物體轉動,相當於roll和yaw被鎖住了。
萬向鎖的實質是一個x、y、z軸的層級問題,注意父軸轉動的時候里面嵌套着的子軸也會跟着一起轉動。
這個問題無論如何都不能真正解決,只能盡力避免,例如:在遇到萬向鎖問題的時候調整一下旋轉的次序。
四元數
先復習一下復數,因為復數和四元數高度相似。
復數
形式為:a+bi
a稱為實部,b稱為虛部。
復數和復數之間可以相互加減乘。
加減的規則是對應實部和虛部相加減即可。
乘則是用分配律計算,再用i2 = -1即可。
復數共軛
即將虛部符號乘以-1,記作:p*:
例如:p=(a+bi),則p* = (a-bi)
復數的模
即||p||:
復數與旋轉
用復數乘法就可以將一個向量旋轉(並拉伸)到一個角度:
四元數的記法
用三個虛維度來描述空間,而實數則在第四個維度,實數垂直於全部的三個虛軸。
用一個標量分量w和一個3D向量分量(x,y,z),即:
[w,v]或[w,(x,y,z)]
四元數與復數
需要三個虛部。即:[w,(x,y,z)] = w+xi+yj+zk
其中:i2=j2=k2=ijk=-1
四元數與軸-角對
設n為任意旋轉軸,q繞n旋轉θ度,則軸-角對為(n,θ),定義了一個角位移:繞n指定的軸旋轉了θ度:
負四元數
即將每個分量都取負。
-q和q代表的實際角度(角位移)是相同的,例如θ加上360°不會改變角位移,但它使q的四個分量都變負了,所以在3D空間中任意角位移都有兩種不同的表示方法,他們互相為負。
單位四元數
即[1,(0,0,0)]或[1,0]。
它代表沒有旋轉(即角位移)。它的相當於實數里面的1、矩陣里面的單位矩陣。
四元數的模
與向量的模、復數的模完全相同。
把軸-角對的n和θ帶入到四元數模的公式里:
四元數的模幾何意義是:當n為單位向量時(||n|| = 1),||q|| = 1,稱為單位(規范化)四元數。
四元數的逆
四元數的逆p-1與實數的逆類似。例如:a的逆a-1為1/a,即a-1a=1,則q-1q=[1,(0,0,0)](單位四元數)。
四元數叉乘
注意:
-
四元數叉乘滿足結合律。即:q(rs) = (qr)s。
-
四元數叉乘不滿足交換律。即:qr != rq。
-
叉乘后的新四元數的模等於原四元數的模相乘。即:||qr|| = ||q|| ||r||。
此結論保證了兩個單位四元數相乘結果還是單位四元數。
-
叉乘后的逆等於各個四元數的逆以相反的順序相乘,與矩陣的逆的計算相似,並且也可以擴展。即:(ab)-1 = b-1a-1。
四元數的共軛
四元數的共軛q*與復數共軛相同,將虛部求負即可。
注意:v是旋轉軸,這里將v變成負的,意思就是說將旋轉軸的方向變成負的了。
所以四元數的共軛表示的是向相反的方向進行旋轉(即顛倒旋轉軸的正方向)。
我們經常用四元數表示繞着v方向旋轉,而用它的共軛表示繞着v的反方向旋轉。
四元數與旋轉
p是3D中的一任一點,用四元數來表示。
q表示旋轉軸n和旋轉角度θ。
p'表示將 點p 繞着 由q表示的旋轉軸和旋轉角度θ進行旋轉 后的新的點。
下圖表示了先將點p繞着由a表示的旋轉軸和旋轉角度θ進行旋轉,再繞着由b表示的旋轉軸和旋轉角度θ進行旋轉,它符合前面說的叉乘公式(叉乘后的逆等於各個四元數的逆以相反的順序相乘):
四元數“差”
一個方位a和另一個方位b之間有一個角位移d的差距。即從方位a旋轉角度d就能到方位b,或者說方位a與方位b之間的夾角是d。
我們將它叫做“差”,但在數學上實際上是除法,因為角度差計算一般來說要用減法,但是在四元數卻是用的除來表示差。計算方式是:
四元數點乘
與向量的點乘相同。
四元數的對數、指數、和標量乘運算
這三種運算我們很少直接使用。
首先,讓我們重寫四元數的定義,引入一個新的變量a,等於半角θ/2:
a=θ/2
四元數對數:
四元數指數:
四元數和標量相乘:
四元數求冪
四元數能作為底數,記作qt(不要和指數運算混淆,指數運算具接受一個四元數作為參數,而四元數求冪有兩個參數——四元數和指數)。四元數求冪的意義類似於實數求冪。
這對四元數求冪非常有用,因為它可以從角位移中抽取“一部分”。例如,四元數q代表一個角位移。現在想要得到代表1/3這個角位移的四元數,可以這樣計算:q1/3。
指數超出[0,1]范圍外的幾何行為和預期的一樣(但有一個重要的注意事項)。例如,q2代表的角位移是q的兩倍。假設q代表繞x軸順吋針旋轉30°,那么q代表繞x軸順時針旋轉60°。q-1/3代表繞x軸逆時針旋轉10°。
它的定義是:
四元數插值
當令3D數學中四元數存在的理由是由於一種稱作serp的運算,它是球面線性插值的縮寫 Spherical Linear Interpolation) slerp運算非常有用,因為它可以在兩個四元數間平滑插值slerp運算避免了歐拉角插值的所有問題。
slerp的基本思想是沿着4D球面上連接兩個四元數的弧插值(這就是球面線性插值這個名稱的由來)。
各表示方法的優缺比較
補充說明:
- 易用程度:即直觀程度,是否符合人的思維習慣。例如歐拉角就很符合人的思維習慣,人一眼就能看出來它們分別在哪個軸上面旋轉了多少度。
- 表達式不唯一:例如在歐拉角中(127°+180°)與127°表達的旋轉角度一致。
- 四元數能和矩陣快速轉換。
- 歐拉角使用簡單插值可能會導致過多旋轉,物體將會沿“長弧”旋轉。
各個方法的選擇建議
- 為世界中的物體指定方位時,歐拉角最簡單。
- 如果需要在坐標系之間轉換向量,那么就選擇矩陣形式。
- 需要大量保存方位數據如動畫)時,就使用歐拉角或四元數。歐拉角將少占用25%的內存。但它在轉換到矩陣時要稍徽慢一些。
- 如果動畫數據需要嵌套坐標系之間的連接,四元數可能是最好的選擇。
- 平滑的插值只能用四元數完成。如果您用其他形式,也可以先轉換到四元數然后再插值
插值完畢后再轉換回原來的形式。
各個表達式之間的轉換
略。
參考資料&原文鏈接
本文標簽
游戲開發
、3D數學基礎:圖形與游戲開發
、Unreal Engine
、游戲開發基礎
、數學
、游戲開發數學基礎
、書籍筆記
、筆記
。