方形物体绕中心旋转的扭力_三维旋转
本篇文章主要介紹三維空間下旋轉的三種表示形式:四元數、矩陣和歐拉角,闡述了三種旋轉表示的數學原理并且對比了它們的優缺點。目錄結構:
- 四元數
- 旋轉矩陣
- 歐拉角
- 參考
1. 四元數
四元數(Quaternion)是由愛爾蘭數學家威廉?盧云?哈密頓在1843年發現的數學概念,在圖形學中有重要的應用。在3D程序中,通常用四元數來計算3D物體的旋轉角度,與矩陣相比,四元數更加高效,占用的儲存空間更小,此外也更便于插值。
任意一個四元數可以表示為:
其中,
,注意,但是。四元數的長度(模長)表示為,通常將四元數規一化(Normalized),即:四元數本質上是復數(Complex Number),復數就存在一個共軛的概念。若兩個復數的實部相等,虛部互為相反數,則稱這兩個復數互為共軛(Conjugate),
的共軛復數表示為:四元數間的運算,遵循復數間運算法則。
加減法:
與系數的乘積:
點積:
四元數點積與向量點積相似,也可以計算四元數之間的角度差,即:
四元數間的乘積不遵守交換律,表示為:
等式展開得:
其中,
任意一個四元數可以分解為向量和標量兩部分,即
,則兩個四元數的乘積有下列等式成立,具體的推導參見[2][3]:根據歐拉旋轉定理,任何坐標系的相對定向,可以用四個數來規定。四元數原理的核心也在于:三維空間內,所有的旋轉都可以用四個數來表示。通過四元數來計算旋轉,它能減少所需的工作,并減小舍入誤差。在電腦圖形學里,四元數的插值計算是很簡單的,這有非常重要的應用價值。
圖1. 繞著指定軸的旋轉[1]在三維空間上,物體繞著任意一條軸旋轉
度,任意一個繞著指定點的旋轉都可以表示成繞著經過該點的軸的旋轉,如圖1所示,考慮繞著點的旋轉,任意一個點經過旋轉變換后,得到新的點。用四元數表示繞著軸旋轉角度的旋轉:其中,
。相反,給定一個四元數
,可以計算出它表示的旋轉軸和角度,如下所示:其中,若
,則表示繞著任意坐標軸旋轉度。假設存在一個向量
和一個四元數,四元數可以表示一個旋轉,把向量進行旋轉變換,得到新向量,可以表示為:把等式(10)代入等式(13),且由拉格朗日公式
,上式可以簡化為:若對向量
進行四元數表示的旋轉的逆變換,得到新向量,可以表示為:可以簡化為:
圖2. 線性插值最后,介紹下四元數的球面插值。以線性插值為例,如圖2所示,在兩個向量
之間插值,得到等式,線性插值存在一個缺點是,在以為半徑的圓的曲線軌跡上不是恒速變化的。圖3. 球面插值四元數的球面插值(Spherical Linear Interpolation)仍然只用于表示旋轉,它是關于單位四元數構成的球表面上的操作。如圖3所示,作輔助線,經過點
作一條平行于的直線,相交于點;經過點作一條直線垂直于,并交于點; 經過點,作一條直線平行于,與交于點。易知,,則易知,即有:同理,可以計算出:
四元數的球面插值可以表示為:
四元數廣泛的應用在3D游戲動作的旋轉表示,四元數表示旋轉不直觀,但是更健壯、更高效。四元數只有4個值,矩陣有9個,花費更少的空間和時間。當使用浮點數對矩陣進行大量的操作,浮點數的誤差就會不斷累積到矩陣,誤差的累積會使得旋轉的計算發生錯誤,四元數的計算更少,誤差也會相應的更少,也不會出現歐拉角中出現的萬向節死鎖。
2. 旋轉矩陣
在二維空間上,繞著原點,沿著逆時針方向旋轉
角,可以用的矩陣表示為:在三維空間上,繞著
軸、軸、軸的旋轉分別用的矩陣表示,有其中,沿著坐標軸相反的方向觀察,
表示逆時針旋轉的角度。如果希望三維空間上的物體能繞著
軸旋轉度,旋轉中心的齊次表示為,那么該如何進行變換呢[1]?由于采用矩陣形式的變換,可以用矩陣的乘積來疊加。首先,應該進行平移變換,使點與原點重合,這一過程可以用表示;然后,進行旋轉變換;最后,再進行位移變換,返回至物體原先坐標。總的變換矩陣用表示,則可以用表示變換后的點,為:在三維空間上,物體繞著任意一條軸旋轉
度可以用的旋轉矩陣表示[1]。任意一個繞著指定點的旋轉都可以表示成繞著經過該點的軸的旋轉,如圖1所示,考慮繞著點的旋轉,任意一個點經過旋轉變換后,得到新的點。我們可以把這樣的旋轉分解為幾個步驟:- i. 把軸進行兩次旋轉變換,即和,使得軸與軸方向相同;
- ii. 繞著軸旋轉度,即;
- iii. 與第i步相反的旋轉變換,使得軸恢復到最初方向。
組合上述5個旋轉變換,總的變換可以表示為
把等式(21)中的變換等式代入(23)中,可以得到總的變換等式
其中,
。相反,若給定一個旋轉矩陣
,我們也可以求出它是繞著哪條坐標軸旋轉多少度角?設由等式(24),可以計算出旋轉的角度為
軸
三個方向的分量為旋轉矩陣
有三個重要的性質:- i.
- ii.
- iii.
單位四元數
,可以用矩陣形式表示為:旋轉矩陣在圖形渲染中占據著非常重要的作用,它支持傳遞性,使用起來很簡單方便,但是不直觀,比較浪費內存,至少需要12個參數矩陣插值的實現難度很大。
3. 歐拉角
歐拉角是用于描述剛體在三維空間的朝向,它是相對于指定參考坐標系的旋轉,一個剛體的朝向,依賴于參考坐標系,按一定順序,做出的三個歐拉角的旋轉而構成的。
歐拉角包括3個旋轉,根據這3個旋轉來指定一個剛體的朝向。這3個旋轉分別繞x軸,y軸和z軸,分別稱為Pitch,Yaw和Roll,如圖4所示。歐拉角可以表示成z-x-z,x-y-x,z-y-z等形式,旋轉的順序影響結果。
PitchYawRoll歐拉角很重要的一個優點就是直觀,容易理解,但是也存在一些致命的缺點。旋轉的順序會影響旋轉的結果,不同的應用又可能使用不同的旋轉順序,旋轉順序無法統一。3個旋轉的角度可以不受限制,即可以是10000度,也可以是-1500度。還可能造成萬向節死鎖(Gimbal Lock)。
如圖5所示,當兩個環發生重疊的時候,就會丟失了一個自由度,也正是由于鎖的存在,無法使用歐拉角實現球面平滑的插值。萬向節死鎖可以參考[6]提供的視頻,對知識點的介紹非常的形象生動。
圖5. 萬向節死鎖參考
[1] F. Hill, and S. Kelley. Computer Graphics Using OpenGL, 3/E, Pearson, 2007.
[2] WIKIPEDIA. “Quaternions and spatial rotation. website<https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation>
[3] WIKIPEDIA. “Quaternions.” website< https://en.wikipedia.org/wiki/Quaternion>.
[4] WIKIPEDIA. “Euler angles.” website< https://en.wikipedia.org/wiki/Euler_angles>.
[5] Fletcher Dunn and Ian Parberry. 3D math primer for graphics and game development. CRC Press, 2015.
[6] Youku, “歐拉旋轉.”, website<https://v.youku.com/v_show/id_XNzkyOTIyMTI=.html>.
總結
以上是生活随笔為你收集整理的方形物体绕中心旋转的扭力_三维旋转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何open一个新tab页面
- 下一篇: python读取sqlserver数据库