學習四元數(shù)筆記_第1頁
學習四元數(shù)筆記_第2頁
學習四元數(shù)筆記_第3頁
學習四元數(shù)筆記_第4頁
學習四元數(shù)筆記_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、復數(shù)是由實數(shù)加上虛數(shù)單位 i 組成,其中i2 = -1 ,。相似地,四元數(shù)都是由實數(shù)加上三個元素 i、j、k 組成,而且它們有如下的關系:i2 = j2 = k2 = ijk = -1 ,每個四元數(shù)都是 1、i、j 和 k 的線性組合,即是四元數(shù)一般可表示為a + bi + cj + dk ,。四元數(shù)不像實數(shù)或復數(shù)那樣,它的乘法是不可交換的,看乘數(shù)表四元數(shù)的優(yōu)點是:表達式無奇點(和例如歐拉角之類的表示相比)比矩陣更簡煉(也更快速)單位四元數(shù)的對可以表示四維空間中的一個轉動。以矩陣表示四元數(shù)編輯有兩種方法能以矩陣表示四元數(shù),並以矩陣之加法、乘法應用於四元數(shù)之加法、乘法。第一種是以二階複數(shù)矩陣表示

2、。若 h = a + bi + cj + dk 則它的複數(shù)形式為:這種表示法有如下優(yōu)點:所有複數(shù) (c = d = 0) 就相應於一個實矩陣。四元數(shù)的絕對值的平方就等於矩陣的行列式。四元數(shù)的共軛值就等於矩陣的共軛轉置。對於單位四元數(shù) (|h| = 1) 而言,這種表示方式給了四維球體和SU(2)之間的一個同型,而後者對於量子力學中的自旋的研究十分重要。(請另見泡利矩陣)第二種則是以四階實數(shù)矩陣表示:其中四元數(shù)的共軛等於矩陣的轉置。(轉載)四元數(shù)入門 (2012-02-14 00:52:24)轉載標簽: computer graphic quaternion 四元數(shù) it分類: 學習(轉載)四元

3、數(shù)入門 - 4元數(shù)寶典這是國內找不到的超好文章。(為什么大陸的4元數(shù)文章很垃圾呢?)(翻譯中。奉獻給大家)70秒即懂,能使用,用四元數(shù),4元數(shù),闊特尼恩,Quaternion旋轉(C) 中田 亨 (獨立行政法人 產(chǎn)業(yè)技術綜合研究所 數(shù)字人類研究中心 研究員 博士(工學) 2003年11月25日這個頁面的對象讀者想把三次元的旋轉,用CG等定量地處理的人使用歐拉角(Euler Angles)的話,不懂得其道理的人 卡爾丹角和歐拉角(Cardan Angles)不能區(qū)別的人 對吉恩瓦爾洛克很困惑的人但是,對數(shù)學之類麻煩的事情很討厭的人想要實例程序的人 沒有時間的人旋轉篇:我將說明使用了四元數(shù)(si

4、yuan shu, quaternion)的旋轉的操作步驟()四元數(shù)的虛部,實部和寫法所謂四元數(shù),就是把4個實數(shù)組合起來的東西。4個元素中,一個是實部,其余3個是虛部。比如,叫做Q的四元數(shù),實部t而虛部是x,y,z構成,則像下面這樣寫。Q = (t; x, y, z) 又,使用向量 V=(x,y,z),Q = (t; V) 也可以這么寫。正規(guī)地用虛數(shù)單位i,j,k的寫法的話,Q = t + xi + yj + zk 也這樣寫,不過,我不大使用()四元數(shù)之間的乘法虛數(shù)單位之間的乘法 ii = -1, ij = -ji = k (其他的組合也是循環(huán)地以下同文) 有這么一種規(guī)則。(我總覺得,這就像是

5、向量積(外積),對吧) 用這個規(guī)則一點點地計算很麻煩,所以請用像下面這樣的公式計算。A = (a; U) B = (b; V) AB = (ab - U·V; aV + bU + U×V)不過,“U·V”是內積,U×V是外積的意思。注意:一般AB<>BA所以乘法的左右要注意?。?)3次元的坐標的四元數(shù)表示如要將某坐標(x,y,z)用四元數(shù)表示,P = (0; x, y, z) 則要這么寫。 另外,即使實部是零以外的值,下文的結果也一樣。用零的話省事所以我推薦。()旋轉的四元數(shù)表示以原點為旋轉中心,旋轉的軸是(, , )(但 2 + 2 + 2

6、 = 1), (右手系的坐標定義的話,望向向量(, , )的前進方向反時針地) 轉角的旋轉,用四元數(shù)表示就是,Q = (cos(/2); sin(/2), sin(/2), sin(/2) R = (cos(/2); - sin(/2), - sin(/2), - sin(/2) (另外R 叫 Q 的共軛四元數(shù)。)那么,如要實行旋轉,則 R P Q = (0; 答案)請像這樣三明治式地計算。這個值的虛部就是旋轉之后的點的坐標值。 (另外,實部應該為零。請驗算看看)*未完。instemast_REAL 2007-2-24 19:04:57 注冊: 2007-2 狀態(tài): Offline 1 Top

7、 instemast_REALExp:124偵察兵 發(fā)表于: 2007-2-24 19:06:00 檔案 | 短信 | 樹狀 | 收藏 | 編輯 | 刪除 | 引用 -Re:4元數(shù)寶典/ Quaternion.cpp / (C) Toru Nakata, toru-nakataaist.go.jp / 2004 Dec 29 #include <math.h> #include <iostream.h> / Define Data type typedef struct double t; / real-component double x; / x-component

8、 double y; / y-component double z; / z-component quaternion; / Kakezan 乘quaternion Kakezan(quaternion left, quaternion right) quaternion ans; double d1, d2, d3, d4; d1 = left.t * right.t; d2 = -left.x * right.x; d3 = -left.y * right.y; d4 = -left.z * right.z; ans.t = d1+ d2+ d3+ d4; d1 = left.t * ri

9、ght.x; d2 = right.t * left.x; d3 = left.y * right.z; d4 = -left.z * right.y; ans.x = d1+ d2+ d3+ d4; d1 = left.t * right.y; d2 = right.t * left.y; d3 = left.z * right.x; d4 = -left.x * right.z; ans.y = d1+ d2+ d3+ d4; d1 = left.t * right.z; d2 = right.t * left.z; d3 = left.x * right.y; d4 = -left.y

10、* right.x; ans.z = d1+ d2+ d3+ d4; return ans; / Make Rotational quaternion 求旋轉四元quaternion MakeRotationalQuaternion(double radian, double AxisX, double AxisY, double AxisZ) quaternion ans; double norm; double ccc, sss; ans.t = ans.x = ans.y = ans.z = 0.0; norm = AxisX * AxisX + AxisY * AxisY + Axis

11、Z * AxisZ; if(norm <= 0.0) return ans; norm = 1.0 / sqrt(norm); AxisX *= norm; AxisY *= norm; AxisZ *= norm; ccc = cos(0.5 * radian); sss = sin(0.5 * radian); ans.t = ccc; ans.x = sss * AxisX; ans.y = sss * AxisY; ans.z = sss * AxisZ; return ans; / Put XYZ into quaternion 把XYZ到四元quaternion PutXYZ

12、ToQuaternion(double PosX, double PosY, double PosZ) quaternion ans; ans.t = 0.0; ans.x = PosX; ans.y = PosY; ans.z = PosZ; return ans; / main int main() double px, py, pz; double ax, ay, az, th; quaternion ppp, qqq, rrr; cout << "Point Position (x, y, z) " << endl; cout <<

13、; " x = " cin >> px; cout << " y = " cin >> py; cout << " z = " cin >> pz; ppp = PutXYZToQuaternion(px, py, pz); while(1) cout << "/nRotation Degree ? (Enter 0 to Quit) " << endl; cout << " angle = " ci

14、n >> th; if(th = 0.0) break; cout << "Rotation Axis Direction ? (x, y, z) " << endl; cout << " x = " cin >> ax; cout << " y = " cin >> ay; cout << " z = " cin >> az; th *= 3.1415926535897932384626433832795

15、/ 180.0; / Degree -> radian; qqq = MakeRotationalQuaternion(th, ax, ay, az); rrr = MakeRotationalQuaternion(-th, ax, ay, az); ppp = Kakezan(rrr, ppp); ppp = Kakezan(ppp, qqq); cout << "/nAnser X = " << ppp.x << "/n Y = " << ppp.y << "/n Z = &

16、quot; << ppp.z << endl; return 0; *未完。 四元數(shù)的長處和缺點冰川球的吉恩瓦爾。吸收前后左右的傾斜而保持水平長處“直觀的”如果給出旋轉軸和旋轉角度的話,就算不考慮歐拉角之類的,也可以立即計算?!斑B續(xù)性”表示相似的旋轉的四元數(shù)的值也相似。沒有吉恩瓦爾洛克現(xiàn)象。(所謂吉恩瓦爾洛克就是,“北極和南極等特殊點,在自轉的情況下是不能動的?!薄霸谥袊宛^的圓桌上,放在正中央的醬油怎么轉也轉不近”等,有效的自由度和次元喪失的現(xiàn)象。在軟件中成為例外處理的困難因而是麻煩事。本來吉恩瓦爾是把羅盤針吊起來的機構。為了使得即便船搖晃羅盤針也保持水平而不搖晃。吉

17、恩瓦爾的柄把羅盤針晃晃蕩蕩地吊著,但若使得這些東西的方向一致了,就不能晃了(=洛克lock),振動傳到羅盤針了。)“記憶效率好,計算快”旋轉能夠只用4個數(shù)值記述。與阿弗因變換矩陣等相比,不用記憶。減少不必要的計算。 缺點“從外觀上看不知道表示什么意思” 從四元數(shù)的成分來看,其表示什么意思,一眼看不出來。 “不能表示多圈旋轉”如你所見,使用cos和sin,所以是10度,370度,還是-350度,不能區(qū)別。想要制作咕嚕咕嚕轉許多圈的動畫的情況下,不想只旋轉一遍,請仔細區(qū)分?!笆且栽c為中心的旋轉”想以原點以外為中心的情況,請讓坐標穿上木屐,旋轉,然后還原木屐。(下文的一般位移篇也check一下吧!

18、)四元數(shù)旋轉的軟件的源代碼<<source code 貼過了>>一般位移篇:作為旋轉以外的變形的擴大縮?。ㄅc并進)的步驟考慮四元數(shù)的標量倍,就可以將旋轉篇的結果坐標給擴大縮小。比如,P = (0; x, y, z)(另外實部可以為任意值。0好算)kQ = (kcos(/2); k sin(/2), k sin(/2), k sin(/2)kR = (kcos(/2); -k sin(/2), -k sin(/2), -k sin(/2) (KR是KQ的共軛四元數(shù)。)則有,kR P kQ = ( 0; 旋轉后的XYZ坐標的k的自乘倍)這樣,就可以將以原點為中心的旋轉,和以

19、原點為中心的擴大縮小一起操作了。這表示,可以自由地操作以原點為準的方位及其距離。就是說,將一點(X,Y,Z)映射到任意的點(X',Y',Z')的變換,可以用四元數(shù)表示。但X=Y=Z=0的情況例外。制作你所希望的四元數(shù)篇:實施某旋轉的四元數(shù)的作法表示將一點A,移到別的點B的以原點為中心的旋轉的四元數(shù),像這樣制作。旋轉軸(,)和位置向量的外積 × 平行且同向。(A和B的順序,按四元數(shù)R和Q的乘法的順序交替。本文的乘法順序的定義的話,就是BA的順序。)作了除法之后,將把長度改為1。(,) (×) / (×)cos()是,將位置向量的內積 

20、3; 除以·。cos() (·) / (·)根據(jù)三角函數(shù)的半角公式,cos(/2)± 0.5 * (1 + cos) sin(/2)± 0.5 * (1 - cos) 正負號呢,由于 0°180°所以,cos(/2) 且 sin(/2) 就是說,兩邊都為正。cos(/2) 0.5 * (1 + cos) sin(/2) 0.5 * (1 - cos) 也要進行擴大縮小的情況、k = /從歐拉角到四元數(shù)的變換及其逆變換的問題(背景說明篇)這個問題時不時被談論,由于數(shù)學原因和數(shù)學之外的事情而很難。 3次元的旋轉呢,(1) 作為旋

21、轉軸的直線(2) 旋轉角度有這兩個信息,就可以表示。這便是“萬能的3次元旋轉表示”。把這樣的單次的旋轉叫做single rotation。(注意:single rotation 沒有旋轉中心點。只有旋轉軸。如果是,關于像球形關節(jié)這樣的旋轉的,擁有不同旋轉軸的single rotation 復合而成的 rotation sequence ,的話,就能夠考慮旋轉中心點了。)(*譯注:此句的復句結構復雜,但無論怎么理解都不影響意思!) (注意:四元數(shù)將single ratation以旋轉軸和旋轉角度的信息來直接地表示。歐拉角呢,是要把一個single rotation,用分解為3個single ro

22、tation的方式來表示??梢哉f故意搞復雜了。而且,蘊含著引起吉恩瓦爾洛克的問題的可能性。)“歐拉角->四元數(shù)”考慮像這樣的直接的變換是非常難的問題。正確的是,應該取,像“歐拉角->萬能表示->四元數(shù)”這樣的,“一種表式形式->萬能表示->別的表示形式”的路徑。我想這最安全也易思考。 文章主要內容在前面,后面閑談比較多。而且后面的語法有點亂(科學家語文不好,還喜歡用復雜句式)但注意,他告訴了我們什么是真正的歐拉角,這有點出乎意料,和一般d3d書上說的不一樣。變換困難的數(shù)學原因四元數(shù):原點不在旋轉軸上的情況,必須將其木屐(偏移量)用別的途徑表示。歐拉角:不僅有原點的

23、偏移量的問題,而且,產(chǎn)生吉恩瓦爾洛克現(xiàn)象情況下必須做例外處理。還有,軸的旋轉順序(雖說有慣例但)不統(tǒng)一。(總的來說歐拉角有太多使用上的難點。)變換困難的數(shù)學之外的原因數(shù)據(jù)格式因軟件而異。“一段變換程序”只在一個公司的軟件范圍內通用。 坐標軸的設定不同。右手系還是左手系不統(tǒng)一。還有“向上”和“向右”是哪個軸等問題。也有歷史原因,所以不統(tǒng)一。角度的正負方向的決定方式難以知曉。數(shù)據(jù)格式與坐標軸設定的技術,光看源代碼不知道。(特別是,擁有三個角度的歐拉角很麻煩)既如此,為什么要用歐拉角呢?because there are many gyros whitch are roll,pitch and ya

24、w,in the output?像大炮的底座一樣地,機構使用了roll,pitch,yaw的情況也是有的。(注:gyro = gyrocompass旋轉羅盤,gyroscope陀螺儀)歐拉角是什么Euler考慮到,“一個三次元的single rotation,可以以組合三個以坐標軸作為旋轉軸的三次元旋轉的方式來表示”。這是廣義的歐拉角。就是說,以,從坐標系看來傾斜的軸,為旋轉軸的旋轉,搞得好的話,首先以Z軸中心旋轉度,然后以X軸中心旋轉度,最后以Z軸中心旋轉度,以這種方式,是可以作出一模一樣的旋轉的。(發(fā)生吉恩瓦爾洛克現(xiàn)象的情況,失去了解的一義性,成為了件麻煩的事情。)歐拉自己,把旋轉軸的選擇

25、方式使用了Z-X-Z。這個選軸順序的情況,是狹義的歐拉角。(考慮陀螺的運動的時候,首先把陀螺的高速自轉用Z軸旋轉表示,把陀螺的芯棒倒向地面的旋轉用X軸旋轉表示把陀螺芯棒的水平旋轉用Z軸旋轉表示。)世上像Z-Y-Z、X-Z-X, Y-X-Y之類的模式,似乎也有人稱之為歐拉角的。軸的選擇方式,也有,像X-Y-Z,Y-Z-Z這樣的3軸順次使用的模式。(另外,3個軸的立場不是平等的。存在著由旋轉操作的先后所引起的不同。)也有人把這些認作是廣義的歐拉角,而,只承認狹義的歐拉角的人是誤解之源。X-Y-Z式是被頻繁使用的模式。這被叫做roll,pitch,yaw角式,也有人叫卡爾丹角(Cardan angl

26、es)。從歐拉角到四元數(shù)表示這是極其簡單的,把歐拉角的3次旋轉,分別用四元數(shù)表示,順次作乘法即可。從四元數(shù)到歐拉角角四元數(shù)逆変換考。公式化、角Z-X-Z式X-Y-Z式違、大変。発生時、公式中割起、処理面倒。不思議我們來考慮一下“歐拉角-四元數(shù)”的逆變換。雖說可以公式化但是,因歐拉角是Z-X-Z式還是X-Y-Z式的不同,就會有大的變化。吉恩瓦爾洛克現(xiàn)象發(fā)生的時候,在公式中會發(fā)生零作除數(shù)的情況,其處理也麻煩請看。single rotation的不可思議一個single rotation,可以用一個四元數(shù)來表示的。于是可以說,進行N次single rotation的旋轉,能夠用N個四元數(shù)的積的一個四

27、元數(shù)來表示。也就是說,多個single rotation的串珠實行,無視其過程,只看其結果的話,可以只用1個四元數(shù)表示。結果,就算咕嚕咕嚕地轉,也只不過是進行了1個single rotation。就算把足球轉到那邊,再轉回這邊,按照初期姿勢和最終姿勢,完全沒有移動的點至少有2個!或者說,在1次旋轉中,到最終姿勢,只是跳個一下就可以了。四元數(shù)與旋轉姿態(tài)解算的核心在于旋轉,一般旋轉有4種表示方式:矩陣表示、歐拉角表示、軸角表示和四元數(shù)表示。矩陣表示適合變換向量,歐拉角最直觀,軸角表示則適合幾何推導,而在組合旋轉方面,四元數(shù)表示最佳。因為姿態(tài)解算需要頻繁組合旋轉和用旋轉變換向量,所以采用四元數(shù)保存組

28、合姿態(tài)、輔以矩陣來變換向量的方案。下面介紹一下四元數(shù),然后給出幾種旋轉表示的轉換。四元數(shù)可以理解為一個實數(shù)和一個向量的組合,也可以理解為四維的向量。這里用一個圈表示q是一個四元數(shù)(很可能不是規(guī)范的表示方式)。四元數(shù)的長度(模)與普通向量相似。下面是對四元數(shù)的單位化,單位化的四元數(shù)可以表示一個旋轉。四元數(shù)相乘,旋轉的組合就靠它了。旋轉的“軸角表示”轉“四元數(shù)表示”。這里創(chuàng)造一個運算q(w,),用于把繞單位向量w轉角的旋轉表示為四元數(shù)。通過q(w,),引伸出一個更方便的運算q(f,t)。有時需要把向量f的方向轉到向量t的方向,這個運算就是生成表示對應旋轉的四元數(shù)的(后面會用到)。然后是“四元數(shù)表示”轉“矩陣表示”。再次創(chuàng)造運算,用R(q)表示四元數(shù)q對應的矩陣(后面用到)。多個旋轉的組合可以用四元數(shù)的乘法來實現(xiàn)?!八脑獢?shù)表示”轉“歐拉角表示”。用于顯示。姿態(tài)解算框架姿態(tài)解算框架其實就是程序框架了。設計框架既要準確,又要高效。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論