歐拉旋轉(zhuǎn)宪哩、四元數(shù)、矩陣旋轉(zhuǎn)之間的差異
除了歐拉旋轉(zhuǎn)以外谋币,還有兩種表示旋轉(zhuǎn)的方式:矩陣旋轉(zhuǎn)和四元數(shù)旋轉(zhuǎn)仗扬。接下來我們比較它們的優(yōu)缺點(diǎn)。
歐拉角
- 優(yōu)點(diǎn):三個(gè)角度組成蕾额,直觀早芭,容易理解。
- 優(yōu)點(diǎn):可以進(jìn)行從一個(gè)方向到另一個(gè)方向旋轉(zhuǎn)大于180度的角度诅蝶。
- 弱點(diǎn):死鎖問題退个。 前面《【Unity編程】歐拉角與萬向節(jié)死鎖(圖文版)》已經(jīng)介紹過萬向節(jié)死鎖問題。
四元數(shù)
內(nèi)部由四個(gè)數(shù)字(在Unity中稱為x调炬,y语盈,z和w)組成,然而這些數(shù)字不表示角度或軸缰泡,并且通常不需要直接訪問它們刀荒。除非你特別有興趣深入了解四元數(shù)學(xué),你只需要知道四元數(shù)表示三維空間中的旋轉(zhuǎn)棘钞,你通常不需要知道或修改x缠借,y和z屬性。
- 優(yōu)點(diǎn):四元旋轉(zhuǎn)不存在萬向節(jié)鎖問題宜猜。
- 優(yōu)點(diǎn):存儲(chǔ)空間小泼返,計(jì)算效率高。
- 弱點(diǎn):?jiǎn)蝹€(gè)四元數(shù)不能表示在任何方向上超過180度的旋轉(zhuǎn)姨拥。
- 弱點(diǎn):四元數(shù)的數(shù)字表示不直觀绅喉。
矩陣旋轉(zhuǎn)
- 優(yōu)點(diǎn):與四元數(shù)一樣,不存在萬向節(jié)鎖問題
- 優(yōu)點(diǎn):可以表示圍繞任意軸的旋轉(zhuǎn)叫乌,四元數(shù)的旋轉(zhuǎn)軸均為通過物體中心點(diǎn)的軸柴罐,矩陣則不受限
- 缺點(diǎn):矩陣旋轉(zhuǎn)使用4x4矩陣,記錄16個(gè)數(shù)值憨奸,而四元數(shù)只需要4個(gè)數(shù)值丽蝎。計(jì)算復(fù)雜,效率低膀藐。
由于Unity中的旋轉(zhuǎn)使用四元數(shù),因此本文重點(diǎn)就放在四元數(shù)數(shù)學(xué)上红省。矩陣還是某些場(chǎng)合需要用到额各,比如坐標(biāo)變換。不過你幾乎不需要手動(dòng)去執(zhí)行矩陣計(jì)算吧恃,除非你在做Shader編程虾啦,或者是某些需要極端提高效率的場(chǎng)合。后續(xù)我計(jì)劃寫一篇文章專門介紹矩陣變換。
四元數(shù)的數(shù)學(xué)
由于前面兩篇文章均盡可能采用無數(shù)字計(jì)算的方式傲醉,為的是方便理解蝇闭。而這里由于需要理解四元數(shù)的計(jì)算,我們還是需要理解一些復(fù)數(shù)和歐拉旋轉(zhuǎn)計(jì)算方面的基本數(shù)學(xué)硬毕。
復(fù)數(shù)
首先了解一下復(fù)數(shù)呻引,上圖中,左右方向的軸(X軸)稱為實(shí)數(shù)軸吐咳,上下的軸(Y軸)稱為虛數(shù)軸逻悠。
任意一個(gè)二維矢量,都可以使用一個(gè)復(fù)數(shù)形式進(jìn)行表示韭脊。也就是:e = a + bi
其中a是實(shí)數(shù)童谒,i是虛數(shù),i * i=-1沪羔。
至于什么是虛數(shù)饥伊,我的理解它就是個(gè)不同維度的后綴標(biāo)記和符號(hào)而已。i標(biāo)記了實(shí)數(shù)軸和虛數(shù)軸之間的差異蔫饰,也就是旋轉(zhuǎn)90度旋轉(zhuǎn)的差別琅豆,乘以i意味著這種旋轉(zhuǎn)關(guān)系。
為什么i * i=-1?也就是兩個(gè)虛數(shù)i乘積又變成了實(shí)數(shù)-1死嗦?因?yàn)閺膶?shí)數(shù)軸(1表示)圍繞上圖中逆時(shí)針90度(1*i)到達(dá)虛數(shù)軸(=i)趋距,再逆時(shí)針旋轉(zhuǎn)90(1 * i * i)就到達(dá)了負(fù)實(shí)數(shù)軸方向(=-1)。所以這里規(guī)定i * i=-1越除。
復(fù)數(shù)運(yùn)算
- 加法: (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)知識(shí)节腐,請(qǐng)參考“維基百科-復(fù)數(shù)_(數(shù)學(xué))”
歐拉旋轉(zhuǎn)定理
為了方便討論旋轉(zhuǎn),我們避開矢量長(zhǎng)度的影響摘盆,也就是假設(shè)問題是基于長(zhǎng)度為1的矢量去討論翼雀。由上圖可以看出,當(dāng)長(zhǎng)度為1時(shí)孩擂,矢量落在長(zhǎng)度為1的圓形上狼渊,此時(shí)實(shí)數(shù)軸上的a = cos(φ),虛數(shù)軸上的b = sin(φ)类垦,其中φ為旋轉(zhuǎn)角度狈邑。
此時(shí)的表示形式為 e = cos(φ) + sin(φ)i
那么,使用這樣一種形式到底有什么意義呢蚤认?數(shù)學(xué)從來都是工具米苹,如果沒有用處,它也就不會(huì)存在了砰琢。我們接下來看它的作用蘸嘶。
當(dāng)圓上的一個(gè)矢量進(jìn)行了連續(xù)的旋轉(zhuǎn)時(shí)時(shí)良瞧,假設(shè)先旋轉(zhuǎn)φ,再旋轉(zhuǎn)θ训唱,則結(jié)果應(yīng)該是兩個(gè)旋轉(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)θ),可以使用兩個(gè)復(fù)數(shù)的乘積進(jìn)行表示巡通。在計(jì)算機(jī)運(yùn)算中:
- 如果知道φ=30度尘执,那么計(jì)算此單位矢量再旋轉(zhuǎn)θ=40度是很容易的,只需要直接運(yùn)算cos(φ+θ)和sin(φ+θ)即可宴凉。
- 如果知道一個(gè)矢量(a+bi)誊锭,不知其φ值,要對(duì)其進(jìn)行旋轉(zhuǎn)θ=40度弥锄,那么也就有了快速的計(jì)算方法丧靡,即:
(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)
可以快速計(jì)算出二維矢量結(jié)果籽暇,而不必先求φ温治。
因此這就是復(fù)數(shù)和歐拉旋轉(zhuǎn)定理的作用,它可以使用復(fù)數(shù)很方便地表示出二維矢量的旋轉(zhuǎn)變化戒悠。
四元數(shù)
相對(duì)于復(fù)數(shù)為二維空間熬荆,為了解決三維空間的旋轉(zhuǎn)變化問題,愛爾蘭數(shù)學(xué)家威廉·盧云·哈密頓把復(fù)數(shù)進(jìn)行了推廣绸狐,也就是四元數(shù)卤恳。
以下均為定義,所謂定義寒矿,就是我們?nèi)藶樵O(shè)置的概念和計(jì)算方法突琳,它們本身或許沒有什么意義,但是如果按照這些概念和方法計(jì)算出某些有意義的結(jié)果符相,那么這些定義也就有了相應(yīng)的意義拆融。
四元數(shù)定義
四元數(shù)定義i、j啊终、k三個(gè)虛數(shù)單位參與運(yùn)算镜豹,并有以下運(yùn)算規(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)
一個(gè)普通四元數(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ù)欠动、矢量和矩陣一樣,兩個(gè)四元數(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é)多項(xiàng)式乘法相同圈驼,稱為格拉斯曼積人芽。(注意,下面乘積的式子是由多項(xiàng)式形如a+bi+cj+dk的多項(xiàng)式進(jìn)行多對(duì)多乘法(比如4項(xiàng)x4項(xiàng)=16項(xiàng))計(jì)算后绩脆,使用矢量的點(diǎn)積和叉積替代部分計(jì)算項(xiàng)后形成):
<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í)數(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>
點(diǎn)積定義
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
點(diǎn)積也叫做歐幾里得內(nèi)積,四元數(shù)的點(diǎn)積等同于一個(gè)四維矢量的點(diǎn)積主守。點(diǎn)積的值是\(\overline q_1\)中每個(gè)元素的數(shù)值與 \(\overline q_2\) 中相應(yīng)元素的數(shù)值的一對(duì)一乘積(比如4項(xiàng)x4項(xiàng)=4項(xiàng))的和禀倔。這是四元數(shù)之間的可換積,并返回一個(gè)標(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ù)叉積也稱為奇積蹋艺。它和矢量叉積等價(jià),并且只返回一個(gè)矢量值:
<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ù)的共軛的定義黄刚。即實(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">
從以上三個(gè)定義憔维,可以得出一個(gè)推論涛救,一個(gè)四元數(shù)與其共軛的格拉斯曼積等于此四元數(shù)與其自身的點(diǎn)積:
$${\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}}$$
而此時(shí),
$${{\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}}$$
由于第三四項(xiàng)可以消去检吆,第五項(xiàng)本身為0向量,所以得出
$$\overline q\overline q^{}=ww+{\vec {u}}\cdot {\vec {u}}={\overline q\cdot \overline q}$$
于是得證程储,\(\overline q^{}\overline q\)也可以同理得證蹭沛,結(jié)果是與之相同的臂寝。
</script>
模的定義
四元數(shù)的模的定義。與矢量的模類似摊灭,都表示長(zhǎng)度或者絕對(duì)值的意思咆贬。四元數(shù)的絕對(duì)值是四元數(shù)到原點(diǎn)的距離。
<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\)來定義帚呼。在此式左右兩端同時(shí)乘以 \(\overline q^{}\)掏缎,可以得到:
$${ \overline q^{-1}\overline q\overline q^{}={\overline q^{}}}$$
由于格拉絲曼積符合結(jié)合率,左式后兩項(xiàng)先乘煤杀,得到:
$${ \overline q^{-1}(\overline q\overline q^{})={\overline q^{}}}$$
再由上述的推論眷蜈,可以得出:
$${ \overline q^{-1}(\overline q\cdot\overline q)={\overline q^{}}}$$
由于點(diǎn)積是個(gè)實(shí)數(shù),可以使用除法沈自,所以最后簡(jiǎn)化成:
$${ \overline q^{-1}={\frac {\overline q^{*}}{\overline q\cdot \overline q}}}$$
</script>
單位四元數(shù)的定義
所謂的單位量酌儒,都是指,任意原始量乘以單位量之后保持原始量不變酥泛。如對(duì)于實(shí)數(shù)而言今豆,任意原始實(shí)數(shù)乘以實(shí)數(shù)1等于原始實(shí)數(shù),因此1被定義為單位柔袁。
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
對(duì)于四元數(shù)同樣呆躲,任意原始四元數(shù)\(\overline q\)乘以某個(gè)四元數(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)$$
可以推測(cè)
$$w_i= 1, \vec u_i=0$$
也就是腥例,單位四元數(shù)為:
$${\overline q_i =({\vec 0},1)}$$
</script>
四元數(shù)的歸一化
歸一化也叫單位化辅甥,與矢量的概念一樣,就是為了把長(zhǎng)度調(diào)整到單位長(zhǎng)度×鞘現(xiàn)在單位四元數(shù)已經(jīng)得知璃弄,其單位長(zhǎng)度顯然是1。我們也知道了模的計(jì)算方法构回,因此把四元數(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夏块,因?yàn)榇藭r(shí),復(fù)數(shù)的長(zhǎng)度為\(cos(φ){2}+sin(φ){2}=1\)纤掸,我們使用類似形式表示歸一化的四元數(shù):
$${\overline q =({\vec sin(φ)}\vec n,cos(φ))}$$
也就是實(shí)部現(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\)。讓我們嘗試計(jì)算此時(shí)的模:
$${ |\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í)數(shù)映射到四元數(shù)空間掏愁,所謂的映射歇由,也就是說1對(duì)1的找到相應(yīng)的存在卵牍,并且在不同空間施加施加相對(duì)應(yīng)運(yùn)算的法則時(shí)獲得相同的結(jié)果。
例如印蓖,對(duì)應(yīng)實(shí)數(shù)w辽慕,嘗試進(jìn)行如下映射:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
$$\overline q = ( \vec 0,w)$$
那么是否能夠遵守相應(yīng)的運(yùn)算法則?也就是說赦肃,如果實(shí)數(shù)\(w_a\)與實(shí)數(shù)\(w_b\)均被映射到了四元數(shù)空間,那么它們的加法和乘法的結(jié)果是否還能映射回去公浪,與原始空間的運(yùn)算獲得相同的結(jié)果他宛?加法顯然可以,這里進(jìn)行乘法計(jì)算測(cè)試:
$$\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í)數(shù)空間的計(jì)算結(jié)果相同预柒。因此队塘,此映射法則是可行的:
$$\overline q = ( \vec 0,w)$$
</script>
四元數(shù)映射_矢量直接映射
與實(shí)數(shù)映射類似,我們也可以嘗試將三維矢量映射到四元數(shù)宜鸯。
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
對(duì)于矢量\(\vec v\)映射法則如下:
$$\overline q = ( \vec v,0)$$
同樣憔古,加法運(yùn)算顯然可以映射回去,我們來計(jì)算乘法運(yùn)算淋袖。
$$\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)$$
可以看到鸿市,此時(shí)出現(xiàn)了之前兩個(gè)四元數(shù)中均不存在的實(shí)部。因此這個(gè)映射法則是錯(cuò)誤的即碗。(本身兩個(gè)向量之間如果直接使用多對(duì)多的格拉斯曼積式乘法也是沒有意義的焰情,所以結(jié)果可想而知。那么剥懒,是不是就不能映射矢量了内舟?不是,只是映射法則錯(cuò)誤初橘⊙橛危回想之前在在復(fù)數(shù)中也曾使用過格拉斯曼積式的乘法
如果矢量用\(e = cos(φ)+ sin(φ)i\)表示,那么此時(shí)的\(e\)表示了一個(gè)二維旋轉(zhuǎn)壁却,向量的旋轉(zhuǎn)可以使用格拉斯曼積形式的復(fù)數(shù)乘法\(e_1*e_2\)表示批狱,因此,映射法則應(yīng)該與角度相關(guān)展东。)
</script>
四元數(shù)映射_矢量間接映射
同態(tài)
先考慮一個(gè)同態(tài)概念:假設(shè)M赔硫,M′是兩個(gè)乘集,也就是說M和M′是兩個(gè)各具有一個(gè)封閉的具有結(jié)合律的運(yùn)算與的代數(shù)系統(tǒng)盐肃。φ是M射到M′的映射爪膊,并且任意兩個(gè)元的乘積的像是這兩個(gè)元的像的乘積权悟,即對(duì)于M中任意兩個(gè)元a,b,滿足
φ(ab)=φ(a)φ(b);
也就是說推盛,當(dāng)a→φ(a)峦阁,b→φ(b)時(shí),ab→φ(a)φ(b)耘成,
那么這映射φ就叫做M到M′上的同態(tài)榔昔。我前面所解釋的可以互相映射大致意思也就是同態(tài)。
四元數(shù)中的同態(tài)函數(shù)
為什么我們研究同態(tài)瘪菌?因?yàn)檫@里涉及到我們希望出現(xiàn)的向量的旋轉(zhuǎn)撒会,一個(gè)三維空間的向量被旋轉(zhuǎn)之后,它應(yīng)該還是一個(gè)三維矢量师妙。這個(gè)旋轉(zhuǎn)函數(shù)應(yīng)該滿足以下要求:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
①诵肛、旋轉(zhuǎn)完的矢量長(zhǎng)度應(yīng)該保持不變。也就是$$|φ(A)|=|A|$$
②默穴、假如對(duì)向量A和B都執(zhí)行φ旋轉(zhuǎn)怔檩,那么向量A、B的夾角θ應(yīng)該與φ(A)蓄诽、φ(B)的夾角應(yīng)該相同薛训。由矢量點(diǎn)積我們知道$A \cdot B=|A||B|cos(θ)$,在滿足①的情況下若专,也就是模的乘積已經(jīng)不變许蓖,那么如果點(diǎn)積結(jié)果相同,也就能保證角度不變调衰,也就是:$$φ(A) \cdot φ(B)=A \cdot B$$
③膊爪、假如對(duì)向量A和B都執(zhí)行φ旋轉(zhuǎn),那么旋轉(zhuǎn)完畢的φ(A)嚎莉、φ(B)的相對(duì)方向關(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>
接著,我們?cè)敿?xì)了解間接映射的步驟竹勉。如下圖所示:
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default">
我們通過間接映射將矢量V映射到四元數(shù)飞盆,先如直接映射那樣媒咳,映射成一個(gè)純虛四元數(shù)嵌削,即$(\vec V,0)$颓鲜,再執(zhí)行φ()變換尊浪。簡(jiǎn)寫為$$φ(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$$
此時(shí)的$A、B$均是純虛四元數(shù)城看,因此$w_a=w_b=0$女气,可以簡(jiǎn)化為
$$A B=-u_a \cdot u_b+u_a \times u_b$$
由于$A、B$均是純虛四元數(shù)测柠,因此$A \cdot B = u_a \cdot u_b$炼鞠,再由于四元數(shù)叉積和矢量叉積等價(jià),因此上式可以轉(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}$也是可以的肖抱,因?yàn)楦鶕?jù)前述對(duì)逆的計(jì)算,對(duì)于此時(shí)模為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é)荤崇,它用在游戲中的作用主要是計(jì)算三維矢量的旋轉(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ù)。最后可以達(dá)成旋轉(zhuǎn)目的每篷。
</script>
前面的四元數(shù)性質(zhì)不甚了解也沒有太大關(guān)系瓣戚,大概了解到是如何映射的也就可以了。甚至在Unity編程過程中你對(duì)四元數(shù)的映射關(guān)系不了解都無所謂焦读。后續(xù)文章中我再介紹具體的用法子库。