歐拉旋轉(zhuǎn)、四元數(shù)、矩陣旋轉(zhuǎn)之間的差異
除了歐拉旋轉(zhuǎn)以外,還有兩種表示旋轉(zhuǎn)的方式:矩陣旋轉(zhuǎn)和四元數(shù)旋轉(zhuǎn)。接下來我們比較它們的優(yōu)缺點。
歐拉角
- 優(yōu)點:三個角度組成,直觀,容易理解。
- 優(yōu)點:可以進行從一個方向到另一個方向旋轉(zhuǎn)大于180度的角度。
- 弱點:死鎖問題。 前面《【Unity編程】歐拉角與萬向節(jié)死鎖(圖文版)》已經(jīng)介紹過萬向節(jié)死鎖問題。
四元數(shù)
內(nèi)部由四個數(shù)字(在Unity中稱為x,y,z和w)組成,然而這些數(shù)字不表示角度或軸,并且通常不需要直接訪問它們。除非你特別有興趣深入了解四元數(shù)學(xué),你只需要知道四元數(shù)表示三維空間中的旋轉(zhuǎn),你通常不需要知道或修改x,y和z屬性。
- 優(yōu)點:四元旋轉(zhuǎn)不存在萬向節(jié)鎖問題。
- 優(yōu)點:存儲空間小,計算效率高。
- 弱點:單個四元數(shù)不能表示在任何方向上超過180度的旋轉(zhuǎn)。
- 弱點:四元數(shù)的數(shù)字表示不直觀。
矩陣旋轉(zhuǎn)
- 優(yōu)點:與四元數(shù)一樣,不存在萬向節(jié)鎖問題
- 優(yōu)點:可以表示圍繞任意軸的旋轉(zhuǎn),四元數(shù)的旋轉(zhuǎn)軸均為通過物體中心點的軸,矩陣則不受限
- 缺點:矩陣旋轉(zhuǎn)使用4x4矩陣,記錄16個數(shù)值,而四元數(shù)只需要4個數(shù)值。計算復(fù)雜,效率低。
由于Unity中的旋轉(zhuǎn)使用四元數(shù),因此本文重點就放在四元數(shù)數(shù)學(xué)上。矩陣還是某些場合需要用到,比如坐標(biāo)變換。不過你幾乎不需要手動去執(zhí)行矩陣計算,除非你在做Shader編程,或者是某些需要極端提高效率的場合。后續(xù)我計劃寫一篇文章專門介紹矩陣變換。
四元數(shù)的數(shù)學(xué)
由于前面兩篇文章均盡可能采用無數(shù)字計算的方式,為的是方便理解。而這里由于需要理解四元數(shù)的計算,我們還是需要理解一些復(fù)數(shù)和歐拉旋轉(zhuǎn)計算方面的基本數(shù)學(xué)。
復(fù)數(shù)
首先了解一下復(fù)數(shù),上圖中,左右方向的軸(X軸)稱為實數(shù)軸,上下的軸(Y軸)稱為虛數(shù)軸。
任意一個二維矢量,都可以使用一個復(fù)數(shù)形式進行表示。也就是:e = a + bi
其中a是實數(shù),i是虛數(shù),i * i=-1。
至于什么是虛數(shù),我的理解它就是個不同維度的后綴標(biāo)記和符號而已。i標(biāo)記了實數(shù)軸和虛數(shù)軸之間的差異,也就是旋轉(zhuǎn)90度旋轉(zhuǎn)的差別,乘以i意味著這種旋轉(zhuǎn)關(guān)系。
為什么i * i=-1?也就是兩個虛數(shù)i乘積又變成了實數(shù)-1?因為從實數(shù)軸(1表示)圍繞上圖中逆時針90度(1*i)到達虛數(shù)軸(=i),再逆時針旋轉(zhuǎn)90(1 * i * i)就到達了負實數(shù)軸方向(=-1)。所以這里規(guī)定i * i=-1。
復(fù)數(shù)運算
- 加法: (a+bi)+(c+di)=(a+c)+(b+d)i
- 減法: (a+bi)-(c+di)=(a-c)+(b-d)i
- 乘法: (a+bi)(c+di)=ac+bci+adi+bdi^{2}=(ac-bd)+(bc+ad)i
更多復(fù)數(shù)相關(guān)知識,請參考“維基百科-復(fù)數(shù)_(數(shù)學(xué))”
歐拉旋轉(zhuǎn)定理
為了方便討論旋轉(zhuǎn),我們避開矢量長度的影響,也就是假設(shè)問題是基于長度為1的矢量去討論。由上圖可以看出,當(dāng)長度為1時,矢量落在長度為1的圓形上,此時實數(shù)軸上的a = cos(φ),虛數(shù)軸上的b = sin(φ),其中φ為旋轉(zhuǎn)角度。
此時的表示形式為 e = cos(φ) + sin(φ)i
那么,使用這樣一種形式到底有什么意義呢?數(shù)學(xué)從來都是工具,如果沒有用處,它也就不會存在了。我們接下來看它的作用。
當(dāng)圓上的一個矢量進行了連續(xù)的旋轉(zhuǎn)時時,假設(shè)先旋轉(zhuǎn)φ,再旋轉(zhuǎn)θ,則結(jié)果應(yīng)該是兩個旋轉(zhuǎn)的角的和的復(fù)數(shù)形式,即 e = cos(φ+θ)+sin(φ+θ)i
假設(shè):
**e1= cos(φ) + sin(φ)i ** (表示旋轉(zhuǎn)了φ角度)
e2= cos(θ) + sin(θ)i (表示旋轉(zhuǎn)了θ角度)
那么e和e1、e2之間的關(guān)系是怎樣的?
根據(jù)和差公式可以得知
cos(φ+θ)+sin(φ+θ)i
= (cos(φ)cos(θ)-sin(φ)sin(θ))+(sin(θ)cos(φ)+cos(θ)sin(φ))i
= cos(φ)cos(θ)+cos(φ)sin(θ)i+cos(θ)sin(φ)i- sin(φ)sin(θ)
= (cos(φ) + sin(φ)i)*(cos(θ) + sin(θ)i)
= e1 * e2
=>
e = e1*e2
也就是說,連續(xù)的旋轉(zhuǎn)(例如這里旋轉(zhuǎn)φ再旋轉(zhuǎn)θ),可以使用兩個復(fù)數(shù)的乘積進行表示。在計算機運算中:
- 如果知道φ=30度,那么計算此單位矢量再旋轉(zhuǎn)θ=40度是很容易的,只需要直接運算cos(φ+θ)和sin(φ+θ)即可。
- 如果知道一個矢量(a+bi),不知其φ值,要對其進行旋轉(zhuǎn)θ=40度,那么也就有了快速的計算方法,即:
(a+bi) * (cos(40)+sin(40)i) = (a * cos(40)-b * sin(40)) + (b * cos(40) + a * sin(40))i
結(jié)果:二維向量 x = a * cos(40)-b * sin(40),y= b * cos(40) + a * sin(40)
可以快速計算出二維矢量結(jié)果,而不必先求φ。
因此這就是復(fù)數(shù)和歐拉旋轉(zhuǎn)定理的作用,它可以使用復(fù)數(shù)很方便地表示出二維矢量的旋轉(zhuǎn)變化。
四元數(shù)
相對于復(fù)數(shù)為二維空間,為了解決三維空間的旋轉(zhuǎn)變化問題,愛爾蘭數(shù)學(xué)家威廉·盧云·哈密頓把復(fù)數(shù)進行了推廣,也就是四元數(shù)。
以下均為定義,所謂定義,就是我們?nèi)藶樵O(shè)置的概念和計算方法,它們本身或許沒有什么意義,但是如果按照這些概念和方法計算出某些有意義的結(jié)果,那么這些定義也就有了相應(yīng)的意義。
四元數(shù)定義
四元數(shù)定義i、j、k三個虛數(shù)單位參與運算,并有以下運算規(guī)則:
<script type="text/javascript"
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$$jk= i , kj = -i; $$
$$jk= i , kj = -i; $$
$$ki= j , ik = -j; $$
$$ii= jj = kk = ij*k =-1 $$
</script>
i、j、k仍然理解為旋轉(zhuǎn),其中:
- i旋轉(zhuǎn)代表X軸與Y軸相交平面中X軸正向向Y軸正向的旋轉(zhuǎn)
- j旋轉(zhuǎn)代表Z軸與X軸相交平面中Z軸正向向X軸正向的旋轉(zhuǎn)
- k旋轉(zhuǎn)代表Y軸與Z軸相交平面中Y軸正向向Z軸正向的旋轉(zhuǎn)
- -i、-j、-k分別代表i、j、k旋轉(zhuǎn)的反向旋轉(zhuǎn)
一個普通四元數(shù)可以寫成如下形式:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$$\overline q=a+bi+cj+dk$$
</script>
四元數(shù)的i、j、k之間乘法的性質(zhì)與向量之間的叉積結(jié)果形式很類似,于是四元數(shù)有了另外一種表示形式:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$$\overline q=(\vec{(x,y,z)},w)=(\vec u,w)$$
</script>
加法定義
四元數(shù)加法,跟復(fù)數(shù)、矢量和矩陣一樣,兩個四元數(shù)之和需要將不同的元素加起來,加法遵循實數(shù)和復(fù)數(shù)的所有交換律和結(jié)合律:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$${\displaystyle \overline q_1+\overline q_2=w_1+w_2+{\vec {u_1}}+{\vec {u_2}}=(w_1+w_2)+(x_1+x_2)i+(y_1+y_2)j+(z_1+z_2)k}$$
</script>
格拉斯曼積定義
四元數(shù)的乘法有很多種,最常見的一種定義,與數(shù)學(xué)多項式乘法相同,稱為格拉斯曼積。(注意,下面乘積的式子是由多項式形如a+bi+cj+dk的多項式進行多對多乘法(比如4項x4項=16項)計算后,使用矢量的點積和叉積替代部分計算項后形成):
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$$\overline q_1\overline q_2=w_1w_2-{\vec {u_1}}\cdot {\vec {u_2}}+w_1{\vec {u_2}}+w_2{\vec {u_1}}+{\vec {u_1}}\times {\vec {u_2}}$$
</script>
把向量部分和實數(shù)部分分開,可以寫成:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$$\overline q_1\overline q_2=((w_1{\vec {u_2}}+w_2{\vec {u_1}}+{\vec {u_1}}\times {\vec {u_2}}),(w_1w_2-{\vec {u_1}}\cdot {\vec {u_2}}))$$
</script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
注意,格拉斯曼積符合結(jié)合率,也就是\(\overline q_1\overline q_2\overline q_3=(\overline q_1\overline q_2)\overline q_3=\overline q_1(\overline q_2\overline q_3)\),但不符合交換律,一般來說,\(\overline q_1\overline q_2≠\overline q_2\overline q_1\)。
</script>
點積定義
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
點積也叫做歐幾里得內(nèi)積,四元數(shù)的點積等同于一個四維矢量的點積。點積的值是\(\overline q_1\)中每個元素的數(shù)值與 \(\overline q_2\) 中相應(yīng)元素的數(shù)值的一對一乘積(比如4項x4項=4項)的和。這是四元數(shù)之間的可換積,并返回一個標(biāo)量。
$${\overline q_1\cdot \overline q_2=w_1w_2+{\vec {u_1}}\cdot {\vec {u_2}}=w_1w_2+x_1x_2+y_1y_2+z_1z_2}$$
</script>
叉積定義
四元數(shù)叉積:p × q
四元數(shù)叉積也稱為奇積。它和矢量叉積等價,并且只返回一個矢量值:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$${\overline p\times \overline q={\frac {\overline p\overline q-\overline q\overline p}{2}}}$$
$${\overline p\times \overline q={\vec {u}}\times {\vec {v}}}$$
$${\overline p\times \overline q=(cz-dy)i+(dx-bz)j+(by-xc)k}$$
</script>
共軛定義
四元數(shù)的共軛的定義。即實部相同,虛部相反。(與復(fù)數(shù)概念類似)
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$${\overline q^{*}=(\vec{(-x,-y,-z)},w)=(-\vec v,w)}$$
</script>
定義的推論
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
從以上三個定義,可以得出一個推論,一個四元數(shù)與其共軛的格拉斯曼積等于此四元數(shù)與其自身的點積:
$${\overline q\overline q^{}}={{\overline q^{}\overline q}} ={\overline q\cdot \overline q= {x{2}+y{2}+z{2}+w{2}}}$$
證明:
由格拉絲曼積定義可知
$$\overline q_1\overline q_2=w_1w_2-{\vec {u_1}}\cdot {\vec {u_2}}+w_1{\vec {u_2}}+w_2{\vec {u_1}}+{\vec {u_1}}\times {\vec {u_2}}$$
而此時,
$${{\overline q_1=\overline q}}, {{\overline q_2=\overline q^{}}}$$
也就是,
$${\vec {u_1}=\vec {u}}, {\vec {u_2}=-\vec {u}},w_2=w_1=w$$
代入
$$\overline q_1\overline q_2=w_1w_2-{\vec {u_1}}\cdot {\vec {u_2}}+w_1{\vec {u_2}}+w_2{\vec {u_1}}+{\vec {u_1}}\times {\vec {u_2}}$$
得到
$$\overline q\overline q^{}=ww+{\vec {u}}\cdot {\vec {u}}-w{\vec {u}}+w{\vec {u}}+{\vec {u}}\times {\vec {u}}$$
由于第三四項可以消去,第五項本身為0向量,所以得出
$$\overline q\overline q^{}=ww+{\vec {u}}\cdot {\vec {u}}={\overline q\cdot \overline q}$$
于是得證,\(\overline q^{}\overline q\)也可以同理得證,結(jié)果是與之相同的。
</script>
模的定義
四元數(shù)的模的定義。與矢量的模類似,都表示長度或者絕對值的意思。四元數(shù)的絕對值是四元數(shù)到原點的距離。
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$${ |\overline q|={\sqrt {x{2}+y{2}+z{2}+w{2}}}}={\sqrt {w^{2}+\vec u \cdot \vec u}}={\sqrt {\overline q\cdot \overline q}}={\sqrt {\overline q\overline q^{*}}}$$
</script>
逆的定義
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
四元數(shù)的逆通過\(\overline q^{-1}\overline q = 1\)來定義。在此式左右兩端同時乘以 \(\overline q^{}\),可以得到:
$${ \overline q^{-1}\overline q\overline q^{}={\overline q^{}}}$$
由于格拉絲曼積符合結(jié)合率,左式后兩項先乘,得到:
$${ \overline q^{-1}(\overline q\overline q^{})={\overline q^{}}}$$
再由上述的推論,可以得出:
$${ \overline q^{-1}(\overline q\cdot\overline q)={\overline q^{}}}$$
由于點積是個實數(shù),可以使用除法,所以最后簡化成:
$${ \overline q^{-1}={\frac {\overline q^{*}}{\overline q\cdot \overline q}}}$$
</script>
單位四元數(shù)的定義
所謂的單位量,都是指,任意原始量乘以單位量之后保持原始量不變。如對于實數(shù)而言,任意原始實數(shù)乘以實數(shù)1等于原始實數(shù),因此1被定義為單位。
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
對于四元數(shù)同樣,任意原始四元數(shù)\(\overline q\)乘以某個四元數(shù)\(\overline q_i\),原始的四元數(shù)\(\overline q\)保持不變,則稱此四元數(shù)\(\overline q_i\)為單位四元數(shù)。注意這里的乘以是指格拉絲曼積。根據(jù)格拉絲曼積的定義:
$$\overline q\overline q_i=((w{\vec {u_i}}+w_i{\vec {u}}+{\vec {u}}\times {\vec {u_i}}),(ww_i-{\vec {u}}\cdot {\vec {u_i}}))$$
若希望結(jié)果保持不變,也就是結(jié)果仍然為:
$$\overline q\overline q_i=\overline q = (w,\vec u)$$
可以推測
$$w_i= 1, \vec u_i=0$$
也就是,單位四元數(shù)為:
$${\overline q_i =({\vec 0},1)}$$
</script>
四元數(shù)的歸一化
歸一化也叫單位化,與矢量的概念一樣,就是為了把長度調(diào)整到單位長度。現(xiàn)在單位四元數(shù)已經(jīng)得知,其單位長度顯然是1。我們也知道了模的計算方法,因此把四元數(shù)的歸一化方法如下:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$${\overline q^{,} =\frac {\overline q}{|\overline q|}=\frac {\overline q}{{\sqrt {w^{2}+\vec u \cdot \vec u}}}}$$
前述的單位復(fù)數(shù)表示形式為:e = cos(φ)+ sin(φ)i,因為此時,復(fù)數(shù)的長度為\(cos(φ){2}+sin(φ){2}=1\),我們使用類似形式表示歸一化的四元數(shù):
$${\overline q =({\vec sin(φ)}\vec n,cos(φ))}$$
也就是實部現(xiàn)在使用\(cos(φ)\)表示,虛部使用\(sin(φ)\vec n\)表示,其中\(zhòng)(\vec n\)是歸一化的三維矢量,由于\(\vec a \cdot \vec b=|\vec a||\vec b|cos(\theta_{ab})\),因此有\(zhòng)(\vec n \cdot \vec n =1\)。讓我們嘗試計算此時的模:
$${ |\overline q|={\sqrt {w^{2}+\vec u \cdot \vec u}}={\sqrt {cos(φ){2}+sin(φ){2}(\vec n \cdot \vec n)}}}=1$$
</script>
四元數(shù)映射_實數(shù)
我們可以將實數(shù)映射到四元數(shù)空間,所謂的映射,也就是說1對1的找到相應(yīng)的存在,并且在不同空間施加施加相對應(yīng)運算的法則時獲得相同的結(jié)果。
例如,對應(yīng)實數(shù)w,嘗試進行如下映射:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$$\overline q = ( \vec 0,w)$$
那么是否能夠遵守相應(yīng)的運算法則?也就是說,如果實數(shù)\(w_a\)與實數(shù)\(w_b\)均被映射到了四元數(shù)空間,那么它們的加法和乘法的結(jié)果是否還能映射回去,與原始空間的運算獲得相同的結(jié)果?加法顯然可以,這里進行乘法計算測試:
$$\overline q_a = (\vec 0,w_a)$$
$$\overline q_b = (\vec 0,w_b)$$
$$\overline q_a\overline q_b = (\vec 0,w_a) (\vec 0,w_b)=w_aw_b-{\vec {0}}\cdot {\vec {0}}+w_a{\vec {0}}+w_b{\vec {0}}+{\vec {0}}\times {\vec {0}}$$
=>
$$\overline q_a\overline q_b =w_aw_b+\vec {0}=(\vec 0,w_aw_b)$$
顯然,依照映射原則,可以將\((\vec 0,w_aw_b)\)映射回去變成\(w_a\)\(w_b\),與實數(shù)空間的計算結(jié)果相同。因此,此映射法則是可行的:
$$\overline q = ( \vec 0,w)$$
</script>
四元數(shù)映射_矢量直接映射
與實數(shù)映射類似,我們也可以嘗試將三維矢量映射到四元數(shù)。
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
對于矢量\(\vec v\)映射法則如下:
$$\overline q = ( \vec v,0)$$
同樣,加法運算顯然可以映射回去,我們來計算乘法運算。
$$\overline q_a = (\vec v_a,0)$$
$$\overline q_b = (\vec v_b,0)$$
$$\overline q_a\overline q_b = (\vec v_a,0) (\vec v_b,0)=00-{\vec {v_a}}\cdot {\vec {v_b}}+0{\vec {v_b}}+0{\vec {v_a}}+{\vec {v_a}}\times {\vec {v_b}}$$
=>
$$\overline q_a\overline q_b = (\vec {v_a}\times \vec {v_b}, -\vec v_a \cdot\vec v_b)$$
可以看到,此時出現(xiàn)了之前兩個四元數(shù)中均不存在的實部。因此這個映射法則是錯誤的。(本身兩個向量之間如果直接使用多對多的格拉斯曼積式乘法也是沒有意義的,所以結(jié)果可想而知。那么,是不是就不能映射矢量了?不是,只是映射法則錯誤。回想之前在在復(fù)數(shù)中也曾使用過格拉斯曼積式的乘法
如果矢量用\(e = cos(φ)+ sin(φ)i\)表示,那么此時的\(e\)表示了一個二維旋轉(zhuǎn),向量的旋轉(zhuǎn)可以使用格拉斯曼積形式的復(fù)數(shù)乘法\(e_1*e_2\)表示,因此,映射法則應(yīng)該與角度相關(guān)。)
</script>
四元數(shù)映射_矢量間接映射
同態(tài)
先考慮一個同態(tài)概念:假設(shè)M,M′是兩個乘集,也就是說M和M′是兩個各具有一個封閉的具有結(jié)合律的運算與的代數(shù)系統(tǒng)。φ是M射到M′的映射,并且任意兩個元的乘積的像是這兩個元的像的乘積,即對于M中任意兩個元a,b,滿足
φ(ab)=φ(a)φ(b);
也就是說,當(dāng)a→φ(a),b→φ(b)時,ab→φ(a)φ(b),
那么這映射φ就叫做M到M′上的同態(tài)。我前面所解釋的可以互相映射大致意思也就是同態(tài)。
四元數(shù)中的同態(tài)函數(shù)
為什么我們研究同態(tài)?因為這里涉及到我們希望出現(xiàn)的向量的旋轉(zhuǎn),一個三維空間的向量被旋轉(zhuǎn)之后,它應(yīng)該還是一個三維矢量。這個旋轉(zhuǎn)函數(shù)應(yīng)該滿足以下要求:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
①、旋轉(zhuǎn)完的矢量長度應(yīng)該保持不變。也就是$$|φ(A)|=|A|$$
②、假如對向量A和B都執(zhí)行φ旋轉(zhuǎn),那么向量A、B的夾角θ應(yīng)該與φ(A)、φ(B)的夾角應(yīng)該相同。由矢量點積我們知道$A \cdot B=|A||B|cos(θ)$,在滿足①的情況下,也就是模的乘積已經(jīng)不變,那么如果點積結(jié)果相同,也就能保證角度不變,也就是:$$φ(A) \cdot φ(B)=A \cdot B$$
③、假如對向量A和B都執(zhí)行φ旋轉(zhuǎn),那么旋轉(zhuǎn)完畢的φ(A)、φ(B)的相對方向關(guān)系與A、B應(yīng)該保持一致,也就是所謂的手向性應(yīng)該保持一致(比如原來A的正左側(cè)恰好B,旋轉(zhuǎn)完畢應(yīng)該還是在正左側(cè),僅有夾角是不夠的,正右側(cè)也是90度關(guān)系)。假如滿足下面的式子,則手向性不變$$φ(A) \times φ(B)=A \times B$$
</script>
接著,我們詳細了解間接映射的步驟。如下圖所示:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
我們通過間接映射將矢量V映射到四元數(shù),先如直接映射那樣,映射成一個純虛四元數(shù),即$(\vec V,0)$,再執(zhí)行φ()變換。簡寫為$$φ(V)$$
由于$$A B=w_aw_b-u_a \cdot u_b+w_a \cdot u_b+w_b \cdot u_a+u_a \times u_b$$
此時的$A、B$均是純虛四元數(shù),因此$w_a=w_b=0$,可以簡化為
$$A B=-u_a \cdot u_b+u_a \times u_b$$
由于$A、B$均是純虛四元數(shù),因此$A \cdot B = u_a \cdot u_b$,再由于四元數(shù)叉積和矢量叉積等價,因此上式可以轉(zhuǎn)化為
$$A B=-A \cdot B+A \times B$$
如果存在這樣的同態(tài)函數(shù)函數(shù):$$φ(A) φ(B)=φ(AB)$$
也就能滿足②、③的要求。
</script>
[此處還可以解釋得更明確,不過太過復(fù)雜了]
旋轉(zhuǎn)四元數(shù)
最后,給出旋轉(zhuǎn)四元數(shù),也就是一直在追求的φ()函數(shù)。
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$${\overline q =({\vec sin(\frac \theta 2)}\vec n,cos(\frac \theta 2))}$$
它的含義是圍繞\(\vec n\)軸旋轉(zhuǎn)\(\theta\)角度。
具體旋轉(zhuǎn)的方法使用以下函數(shù):
$${\overline p^{,} =\overline q\overline p\overline q^{} }$$
其中\(zhòng)(\overline p\)是被旋轉(zhuǎn)四元數(shù),\(\overline p^{,}\)是結(jié)果四元數(shù)。這里的$\overline q^{}$寫成$\overline q^{-1}$也是可以的,因為根據(jù)前述對逆的計算,對于此時模為1的$\overline q$來說,它們結(jié)果相同的。
具體推究方法以及證明方法過于復(fù)雜,就不在這里給出了。
</script>
總結(jié)
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
四元數(shù)是高階復(fù)數(shù)的數(shù)學(xué),它用在游戲中的作用主要是計算三維矢量的旋轉(zhuǎn),它使用先將矢量映射到純虛四元數(shù),再應(yīng)用形如${\overline p^{,} =\overline q\overline p\overline q^{*} },{\overline q =({\vec sin(\frac \theta 2)}\vec n,cos(\frac \theta 2))}$的旋轉(zhuǎn)函數(shù)。最后可以達成旋轉(zhuǎn)目的。
</script>
前面的四元數(shù)性質(zhì)不甚了解也沒有太大關(guān)系,大概了解到是如何映射的也就可以了。甚至在Unity編程過程中你對四元數(shù)的映射關(guān)系不了解都無所謂。后續(xù)文章中我再介紹具體的用法。