a. 這是一篇講解四元數原理的論文翻譯,原文參見 這里。
b. 在此之前在網絡上找過很多資料,但基本都是結論性的介紹,並未對”為什么“進行深入全面的解釋。因此在看完本文並消化理解了以后,我決定將其翻譯出來,一方面作為知識總結,一方面為相似境遇的朋友提供幫助。
c. 但並不是說這篇翻譯就沒什么錯誤。尤其是在介紹四元數歷史的那節,由於缺少必要的數學涵養,我不自信是否翻得正確,還請各位朋友幫忙校准。另外由於英文水准有限,許多地方翻得比較生硬,望請諸位海涵。
d. 文中( 注: ... ) 的部分,是我根據上下文自己進行的推理,不代表作者觀點(實際上作者在那些地方什么都沒有說,有時候你得自己推一推才能弄明白)。
e. 由於精力和時間關系,我沒有翻譯全文,只是節選了重要的章節。但相信已經覆蓋了必要的四元數的知識,足以支持你完成一個相機系統(Camera System)
f. 之所以說”足以“,是因為我已經用這些理論寫完了一個以四元數為支撐的相機。
g. 從開始有想法對它一探究竟,到一步步實現功能,再到總結性地翻譯本文,每晚見縫插針擠出約2小時,總共歷時近三個月完成。時間之久,身心俱疲。Snake is Old...
-------------------------------------------
四元數
Ken Shoemake
Department of Computer and Information Science
University of Pennsylvania
Philadelphia, PA 19104
概要
凡是圖形學所涉及到的數學知識,大多數都有詳盡完備的介紹,但四元數卻是一個例外。本文因此而寫。這篇教程介紹了諸如“什么是四元數”、“為何它如此有用”、“怎么用、用在哪里”,以及“使用時機”等話題。
介紹
在圖形學領域,四元數一般用來表達旋轉和朝向的概念。在1985年的SIGGRAPH會議上,四元數曲線(quaternion curve) 方法第一次被引入到圖形學中,意圖使旋轉動畫(rotation animation)計算變得更加方便。雖然這只是一個相當特殊的案例,但由於四元數出色的表現,令它無論與主流的矩陣表示法相比,還是與小眾的歐拉角(Euler angles)表示法相比,都不輸分毫。
四元數由此聲名大噪,開始作為一種新技術被應用到曲線方法以及眾多領域中,如基於物理的建模技術,約束系統(constraint system)以及用戶界面(user interface)上。四元數之所以能被廣泛應用,是因為就實現而言,與其他同類技術相比,它不僅更加簡潔,成本更低,而且更加優雅。不過,研究者和開發者想要掌握它,必須要學習一些新的數學知識,但一般的數學課或者科學課程卻都不教授四元數。總之不管怎么說,無論是站在齊次坐標(homogeneous coordinates)的角度看,還是從一個更寬泛的角度看,四元數都不單單是我們所熟知的四維齊次坐標(four-component homogeneous coordinates)的復雜升級版本。
四元數定義
四元數有好幾種定義的方式,這些方式的形態也許有所不同,但實質卻彼此等價。了解這些形態是必要的,因為每一種形態對我們都非常有用。歷史上, Hamilton首次將四元數定義為形如廣義復數的形式: w+ix+jy+kz , 其中,i2 = j2 = k2 = -1, ij = k = -ji ,並且,i,j,k為虛數,而w,x,y,z為實數,(數學家為了紀念Hamilton,用H表示四元數)。四元數的運算中有一個非常特例:乘法的不可交換性。其余的運算性質則與實數的大同小異。Hamilton就曾意識到可以用這種“相似性”來抽象四元數的特性,具體說就是將四元數簡單地看作一個由四個實數組成的集合[x, y, z, w],並適當地為其定義加法和乘法。然而適逢當時復數的出現,Hamilton就將(x,y,z)“打包”成虛部(Imaginary part),並以術語“向量”(vector)稱之,而實數部分(Real part)他就稱為“標量”(scalar)。隨后的研究者們(主要是Gibbs)直接借用了Hamilton發明的這些術語,並從四元數那臟兮兮、但卻很常規的運算法則中提煉出一套更“干凈”的法則(extracted from the clean operations of quaternion arithmetic the somewhat messierÑbut more generalÑoperations of vector arithmetic):即現在的教學課程里都會教授的點積(dot products)與叉積(cross products)運算。對今天的我們而言,我們可以很容易逆觀歷史,用現代的點積、叉積等概念來描述當時的四元數。
基於以上觀點,我們現在來給出一些事實:首先我們一般會這樣定義四元數:[v, w], 其中v是一個向量且等於(x, y, z), 而w是一個實數。假設一個實數s, 如果用四元數形式描述的話,它就等於[0, s],而一個純向量v,如果用四元數描述的話,則是[v,0]。 接下來我們給出四元數的一些基本運算法則:

注意 N(q)是一個標量,所以q的倒數定義很清晰(so the description of q-1 is well-defined)。另外,乘法的不可交換性導致了一些運算需要換用更加清晰的形式來表達( Otherwise, the non-commutativity of multiplication requires explicit expressions),例如要用 pq-1 來代替 p/q。
上面列出的運算公式中,即有運算本身的定義,也有由定義推導得出的結論。試着將這些結論當作定理推導一番是很有用的,而且不難:每一個證明應該都可以直截了當地計算出來。
用四元數表示旋轉
四元數和三維空間內的旋轉關系可以用定理1進行闡述。
定理1:令p為三維(投影)空間內的一個點,用齊次坐標將其表示成四元數的形式即為: p = (x:y:z:w) = [(x, y, z), w] = [v, w] ; 令q為任一非零四元數。那么:
- 結論1) 表達式 qpq-1的結果將使p=[v, w]變換到p`=[v`, w], 二者模長相等。
- 結論2) 任何非零實數與q相乘,上式仍然成立。
- 結論3) 如果上式中的q為N(q) = 1(即q為單位四元數),那么q = [ v sinΩ , cos Ω ] 表示一個旋轉動作:將p沿着單位軸v 旋轉2Ω即得到p'。
證明:讓我們先從結論2入手。這個結論很容易證明。由於sq的倒數是q-1s-1, 且注意標量的乘法滿足交換律,所以我們可以得到:
(sq)·p·(sq)-1 = sq·p·q-1s-1 = qpq-1ss-1 = qpq-1
根據這條結論,我們就可以把這個q直接當作一個單位四元數來看,正如 結論3里所需要的那樣,而又不失一般性。對於單位四元數q, 由於q-1 = q* ,所以我們可以將 qpq-1寫作 qpq*。
現在來證明結論1就簡單多了。一般來說,對一個標量進行一些變換,其結果往往仍是一個標量;類似地,對一個向量[v, 0]進行一系列變換,其結果仍是一個向量。對於任何一個四元數q,其標量部分(即實部) S(q) 可以用公式2S(q) = q + q* 提取出來。於是我們可以得到這列等式:
2S(qpq*)= (qpq*) + (qpq*)* = qpq* + qp*q*
由於四元數的乘法遵循線性規律,我們可以將公因式提出,得到:
q(p+p*)q* = q(2S(p))q* = 2S(p)[注1]
又由於四元數乘法也作用於模長(Because multiplication preserves norms,),得到N(p) = N(p')[注2]; 同時因為w沒有改變,因此可得N(v) = N(v')。
(
注1: 由於2S(p)為標量,我們可以把它放到前面,得2S(p)qq*。又因為結論2已經告訴我們,在q[***]q*這種類型的式子中,q是不是單位四元數都是不影響結果的。因此我們可以將其視作一個單位四元數,這樣便有q* = q-1, 因此2S(p)qq* = 2S(p)qq-1 = 2S(p) 。
注2: 所謂“Because multiplication preserves norms”,我想可以這樣理解:因為p' = qpq*,而因為乘法保留模長,同時我們已把q看作為單位四元數(意味着N(q)=N(q*)=1),因此有N(p') = N(p)。 再注意到上面剛剛證明了2S(p') = 2S(p),即意味着w部相同。兩個四元數模長相等,其實部又相等,可以不難得到其虛部模長也相等,即N(v) = N(v')。
)
最后我們來證明結論3 —— 該定理最核心的部分。考慮下圖中的情形,圖中N(v0) = N(v1) = 1 。 我們定義一個四元數q = v1v0* = [v0 × v1, v0 · v1][注3] 。我們再定義Ω為v0到v1之間的角度, 所以v0·v1 = cosΩ 。我們再在兩向量的叉積方向上再設置一個單位向量 v = (v0 × v1) /‖v0 × v1‖, 該單位向量同時垂直於v0 和v1。現在我們可以將q 寫成 [ v sinΩ, cosΩ][注4] (我們應該假設v1 ≠ ±v0, 否則 q =+ 1, 如此這個旋轉動作是無效的)(We shall assume v1 ± v0, else q = ±1, and the action is the identity)。

(
注3: 這里解釋一下為什么 v1v0* = [v0 × v1, v0 · v1]。 根據前面列出的關於四元數的basic facts,我們知道而v0*= [v0, 0]* = [-v0, 0] = -v0 。同時還知道vv' = [v×v', -v·v'] ,這里令v = v1, v' = v0*。 因此得到v1v0* = (-1)v1v0 = (-1)[v1 × v0, -v1 · v0] = [v0 × v1, v0 · v1] 。
注4: 這里解釋一下為什么q可以寫成 [ v sinΩ, cosΩ]. 至此,我們已經知道q = v1v0*= [v0 × v1, v0 · v1] 。 很明顯v0 · v1 = cosΩ 。 而又有 v0 × v1 = v · ‖v0 × v1‖。 ‖v0 × v1‖是向量積v0 × v1的模長,根據向量積的求模共識,我們有 ‖v0 × v1‖ = ‖v0‖‖v1‖sinΩ, 因為v0、v1皆為單位向量,所以‖v0 × v1‖ =
