【Unity編程】四元數(shù)(Quaternion)與歐拉角

歐拉旋轉(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ù)
復(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)定理

為了方便討論旋轉(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ù)文章中我再介紹具體的用法子库。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市矗晃,隨后出現(xiàn)的幾起案子仑嗅,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件无畔,死亡現(xiàn)場(chǎng)離奇詭異啊楚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浑彰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門恭理,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人郭变,你說我怎么就攤上這事颜价。” “怎么了诉濒?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵周伦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我未荒,道長(zhǎng)专挪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任片排,我火速辦了婚禮寨腔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘率寡。我一直安慰自己迫卢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布冶共。 她就那樣靜靜地躺著乾蛤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捅僵。 梳的紋絲不亂的頭發(fā)上家卖,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音命咐,去河邊找鬼篡九。 笑死,一個(gè)胖子當(dāng)著我的面吹牛醋奠,可吹牛的內(nèi)容都是我干的榛臼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼窜司,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼沛善!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起塞祈,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤金刁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尤蛮,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡媳友,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了产捞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醇锚。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坯临,靈堂內(nèi)的尸體忽然破棺而出焊唬,到底是詐尸還是另有隱情,我是刑警寧澤看靠,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布赶促,位于F島的核電站,受9級(jí)特大地震影響挟炬,放射性物質(zhì)發(fā)生泄漏鸥滨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一谤祖、第九天 我趴在偏房一處隱蔽的房頂上張望爵赵。 院中可真熱鬧,春花似錦泊脐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至约郁,卻和暖如春缩挑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鬓梅。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工供置, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绽快。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓芥丧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坊罢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子续担,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • #1996 AHSME ##1996 AHSME Problems/Problem 1 The addition ...
    abigtreenj閱讀 1,388評(píng)論 0 0
  • 11月4號(hào)上午攜程網(wǎng)訂了一張晚上去廣州城際快車票,全程用時(shí)79分鐘活孩,票價(jià)79.50元物遇。大約20:40分如約而至廣州...
    肥肉先生閱讀 547評(píng)論 1 3
  • 試試先
    艾蕾奧瑙拉閱讀 84評(píng)論 0 0
  • I was off job for almost two months, during this period I...
    ahamoment閱讀 529評(píng)論 0 0
  • ~第五章:最優(yōu)營(yíng)員~ 當(dāng)午后溫暖的夕陽照在房間里時(shí),百草正站在窗邊看著外面的風(fēng)景,一切還都是那么的熟悉又陌生啊询兴,一...
    琢曦閱讀 577評(píng)論 0 0