四元数(Quaternion)和欧拉角(Eulerangle)
歐拉旋轉(zhuǎn)、四元數(shù)、矩陣旋轉(zhuǎn)之間的差異
除了歐拉旋轉(zhuǎn)以外,還有兩種表示旋轉(zhuǎn)的方式:矩陣旋轉(zhuǎn)和四元數(shù)旋轉(zhuǎn)。接下來(lái)我們比較它們的優(yōu)缺點(diǎn)。
歐拉角
優(yōu)點(diǎn):三個(gè)角度組成,直觀,容易理解。
優(yōu)點(diǎn):可以進(jìn)行從一個(gè)方向到另一個(gè)方向旋轉(zhuǎn)大于180度的角度。
弱點(diǎn):死鎖問(wèn)題。 前面《【Unity編程】歐拉角與萬(wàn)向節(jié)死鎖(圖文版)》已經(jīng)介紹過(guò)萬(wàn)向節(jié)死鎖問(wèn)題。
四元數(shù)
內(nèi)部由四個(gè)數(shù)字(在Unity中稱(chēng)為x,y,z和w)組成,然而這些數(shù)字不表示角度或軸,并且通常不需要直接訪(fǎng)問(wèn)它們。除非你特別有興趣深入了解四元數(shù)學(xué),你只需要知道四元數(shù)表示三維空間中的旋轉(zhuǎn),你通常不需要知道或修改x,y和z屬性。
優(yōu)點(diǎn):四元旋轉(zhuǎn)不存在萬(wàn)向節(jié)鎖問(wèn)題。
優(yōu)點(diǎn):存儲(chǔ)空間小,計(jì)算效率高。
弱點(diǎn):單個(gè)四元數(shù)不能表示在任何方向上超過(guò)180度的旋轉(zhuǎn)。
弱點(diǎn):四元數(shù)的數(shù)字表示不直觀。
矩陣旋轉(zhuǎn)
優(yōu)點(diǎn):與四元數(shù)一樣,不存在萬(wàn)向節(jié)鎖問(wèn)題
優(yōu)點(diǎn):可以表示圍繞任意軸的旋轉(zhuǎn),四元數(shù)的旋轉(zhuǎn)軸均為通過(guò)物體中心點(diǎn)的軸,矩陣則不受限
缺點(diǎn):矩陣旋轉(zhuǎn)使用4x4矩陣,記錄16個(gè)數(shù)值,而四元數(shù)只需要4個(gè)數(shù)值。計(jì)算復(fù)雜,效率低。
四元數(shù)的數(shù)學(xué)
由于前面兩篇文章均盡可能采用無(wú)數(shù)字計(jì)算的方式,為的是方便理解。而這里由于需要理解四元數(shù)的計(jì)算,我們還是需要理解一些復(fù)數(shù)和歐拉旋轉(zhuǎn)計(jì)算方面的基本數(shù)學(xué)。
復(fù)數(shù)
首先了解一下復(fù)數(shù),上圖中,左右方向的軸(X軸)稱(chēng)為實(shí)數(shù)軸,上下的軸(Y軸)稱(chēng)為虛數(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),我們避開(kāi)矢量長(zhǎng)度的影響,也就是假設(shè)問(wèn)題是基于長(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é)從來(lái)都是工具,如果沒(méi)有用處,它也就不會(huì)存在了。我們接下來(lái)看它的作用。
當(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
也就是說(shuō),連續(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)變化問(wèn)題,愛(ài)爾蘭數(shù)學(xué)家威廉·盧云·哈密頓把復(fù)數(shù)進(jìn)行了推廣,也就是四元數(shù)。
以下均為定義,所謂定義,就是我們?nèi)藶樵O(shè)置的概念和計(jì)算方法,它們本身或許沒(méi)有什么意義,但是如果按照這些概念和方法計(jì)算出某些有意義的結(jié)果,那么這些定義也就有了相應(yīng)的意義。
四元數(shù)定義
四元數(shù)定義i、j、k三個(gè)虛數(shù)單位參與運(yùn)算,并有以下運(yùn)算規(guī)則:
j?k=i,k?j=?i;
j?k=i,k?j=?i;
j?k=i,k?j=?i;
j?k=i,k?j=?i;
k?i=j,i?k=?j;
k?i=j,i?k=?j;
i?i=j?j=k?k=i?j?k=?1
i?i=j?j=k?k=i?j?k=?1
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ù)可以寫(xiě)成如下形式:
qˉˉ=a+bi+cj+dk
qˉ=a+bi+cj+dk
四元數(shù)的i、j、k之間乘法的性質(zhì)與向量之間的叉積結(jié)果形式很類(lèi)似,于是四元數(shù)有了另外一種表示形式:
qˉˉ=((x,y,z)→,w)=(u? ,w)
qˉ=((x,y,z)→,w)=(u→,w)
加法定義
四元數(shù)加法,跟復(fù)數(shù)、矢量和矩陣一樣,兩個(gè)四元數(shù)之和需要將不同的元素加起來(lái),加法遵循實(shí)數(shù)和復(fù)數(shù)的所有交換律和結(jié)合律:
qˉˉ1+qˉˉ2=w1+w2+u1→+u2→=(w1+w2)+(x1+x2)i+(y1+y2)j+(z1+z2)k
qˉ1+qˉ2=w1+w2+u1→+u2→=(w1+w2)+(x1+x2)i+(y1+y2)j+(z1+z2)k
格拉斯曼積定義
四元數(shù)的乘法有很多種,最常見(jiàn)的一種定義,與數(shù)學(xué)多項(xiàng)式乘法相同,稱(chē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)后形成):
qˉˉ1qˉˉ2=w1w2?u1→?u2→+w1u2→+w2u1→+u1→×u2→
qˉ1qˉ2=w1w2?u1→?u2→+w1u2→+w2u1→+u1→×u2→
把向量部分和實(shí)數(shù)部分分開(kāi),可以寫(xiě)成:
qˉˉ1qˉˉ2=((w1u2→+w2u1→+u1→×u2→),(w1w2?u1→?u2→))
qˉ1qˉ2=((w1u2→+w2u1→+u1→×u2→),(w1w2?u1→?u2→))
注意,格拉斯曼積符合結(jié)合率,也就是 qˉˉ1qˉˉ2qˉˉ3=(qˉˉ1qˉˉ2)qˉˉ3=qˉˉ1(qˉˉ2qˉˉ3)qˉ1qˉ2qˉ3=(qˉ1qˉ2)qˉ3=qˉ1(qˉ2qˉ3),但不符合交換律,一般來(lái)說(shuō), qˉˉ1qˉˉ2≠qˉˉ2qˉˉ1qˉ1qˉ2≠qˉ2qˉ1。
點(diǎn)積定義
點(diǎn)積也叫做歐幾里得內(nèi)積,四元數(shù)的點(diǎn)積等同于一個(gè)四維矢量的點(diǎn)積。點(diǎn)積的值是 qˉˉ1qˉ1中每個(gè)元素的數(shù)值與 qˉˉ2qˉ2 中相應(yīng)元素的數(shù)值的一對(duì)一乘積(比如4項(xiàng)x4項(xiàng)=4項(xiàng))的和。這是四元數(shù)之間的可換積,并返回一個(gè)標(biāo)量。
qˉˉ1?qˉˉ2=w1w2+u1→?u2→=w1w2+x1x2+y1y2+z1z2
qˉ1?qˉ2=w1w2+u1→?u2→=w1w2+x1x2+y1y2+z1z2
叉積定義
四元數(shù)叉積:p × q
四元數(shù)叉積也稱(chēng)為奇積。它和矢量叉積等價(jià),并且只返回一個(gè)矢量值:
pˉˉˉ×qˉˉ=pˉˉˉqˉˉ?qˉˉpˉˉˉ2
pˉ×qˉ=pˉqˉ?qˉpˉ2
pˉˉˉ×qˉˉ=u? ×v?
pˉ×qˉ=u→×v→
pˉˉˉ×qˉˉ=(cz?dy)i+(dx?bz)j+(by?xc)k
pˉ×qˉ=(cz?dy)i+(dx?bz)j+(by?xc)k
共軛定義
四元數(shù)的共軛的定義。即實(shí)部相同,虛部相反。(與復(fù)數(shù)概念類(lèi)似)
qˉˉ?=((?x,?y,?z)→,w)=(?v? ,w)
qˉ?=((?x,?y,?z)→,w)=(?v→,w)
定義的推論
從以上三個(gè)定義,可以得出一個(gè)推論,一個(gè)四元數(shù)與其共軛的格拉斯曼積等于此四元數(shù)與其自身的點(diǎn)積:
qˉˉqˉˉ?=qˉˉ?qˉˉ=qˉˉ?qˉˉ=x2+y2+z2+w2
qˉqˉ?=qˉ?qˉ=qˉ?qˉ=x2+y2+z2+w2
證明: 由格拉絲曼積定義可知
qˉˉ1qˉˉ2=w1w2?u1→?u2→+w1u2→+w2u1→+u1→×u2→
qˉ1qˉ2=w1w2?u1→?u2→+w1u2→+w2u1→+u1→×u2→
而此時(shí),
qˉˉ1=qˉˉ,qˉˉ2=qˉˉ?
qˉ1=qˉ,qˉ2=qˉ?
也就是,
u1→=u? ,u2→=?u? ,w2=w1=w
u1→=u→,u2→=?u→,w2=w1=w
代入
qˉˉ1qˉˉ2=w1w2?u1→?u2→+w1u2→+w2u1→+u1→×u2→
qˉ1qˉ2=w1w2?u1→?u2→+w1u2→+w2u1→+u1→×u2→
得到
qˉˉqˉˉ?=ww+u? ?u? ?wu? +wu? +u? ×u?
qˉqˉ?=ww+u→?u→?wu→+wu→+u→×u→
由于第三四項(xiàng)可以消去,第五項(xiàng)本身為0向量,所以得出
qˉˉqˉˉ?=ww+u? ?u? =qˉˉ?qˉˉ
qˉqˉ?=ww+u→?u→=qˉ?qˉ
于是得證, qˉˉ?qˉˉqˉ?qˉ也可以同理得證,結(jié)果是與之相同的。
模的定義
四元數(shù)的模的定義。與矢量的模類(lèi)似,都表示長(zhǎng)度或者絕對(duì)值的意思。四元數(shù)的絕對(duì)值是四元數(shù)到原點(diǎn)的距離。
|qˉˉ|=x2+y2+z2+w2??????????????√=w2+u? ?u? ????????√=qˉˉ?qˉˉ????√=qˉˉqˉˉ????√
|qˉ|=x2+y2+z2+w2=w2+u→?u→=qˉ?qˉ=qˉqˉ?
逆的定義
四元數(shù)的逆通過(guò) qˉˉ?1qˉˉ=1qˉ?1qˉ=1來(lái)定義。在此式左右兩端同時(shí)乘以 qˉˉ?qˉ?,可以得到:
qˉˉ?1qˉˉqˉˉ?=qˉˉ?
qˉ?1qˉqˉ?=qˉ?
由于格拉絲曼積符合結(jié)合率,左式后兩項(xiàng)先乘,得到:
qˉˉ?1(qˉˉqˉˉ?)=qˉˉ?
qˉ?1(qˉqˉ?)=qˉ?
再由上述的推論,可以得出:
qˉˉ?1(qˉˉ?qˉˉ)=qˉˉ?
qˉ?1(qˉ?qˉ)=qˉ?
由于點(diǎn)積是個(gè)實(shí)數(shù),可以使用除法,所以最后簡(jiǎn)化成:
qˉˉ?1=qˉˉ?qˉˉ?qˉˉ
qˉ?1=qˉ?qˉ?qˉ
單位四元數(shù)的定義
所謂的單位量,都是指,任意原始量乘以單位量之后保持原始量不變。如對(duì)于實(shí)數(shù)而言,任意原始實(shí)數(shù)乘以實(shí)數(shù)1等于原始實(shí)數(shù),因此1被定義為單位。
對(duì)于四元數(shù)同樣,任意原始四元數(shù) qˉˉqˉ乘以某個(gè)四元數(shù) qˉˉiqˉi,原始的四元數(shù) qˉˉqˉ保持不變,則稱(chēng)此四元數(shù) qˉˉiqˉi為單位四元數(shù)。注意這里的乘以是指格拉絲曼積。根據(jù)格拉絲曼積的定義:
qˉˉqˉˉi=((wui→+wiu? +u? ×ui→),(wwi?u? ?ui→))
qˉqˉi=((wui→+wiu→+u→×ui→),(wwi?u→?ui→))
若希望結(jié)果保持不變,也就是結(jié)果仍然為:
qˉˉqˉˉi=qˉˉ=(w,u? )
qˉqˉi=qˉ=(w,u→)
可以推測(cè)
wi=1,u? i=0
wi=1,u→i=0
也就是,單位四元數(shù)為:
qˉˉi=(0? ,1)
qˉi=(0→,1)
四元數(shù)的歸一化
歸一化也叫單位化,與矢量的概念一樣,就是為了把長(zhǎng)度調(diào)整到單位長(zhǎng)度。現(xiàn)在單位四元數(shù)已經(jīng)得知,其單位長(zhǎng)度顯然是1。我們也知道了模的計(jì)算方法,因此把四元數(shù)的歸一化方法如下:
qˉˉ,=qˉˉ|qˉˉ|=qˉˉw2+u? ?u? ????????√
qˉ,=qˉ|qˉ|=qˉw2+u→?u→
前述的單位復(fù)數(shù)表示形式為:e = cos(φ)+ sin(φ)i,因?yàn)榇藭r(shí),復(fù)數(shù)的長(zhǎng)度為 cos(φ)2+sin(φ)2=1cos(φ)2+sin(φ)2=1,我們使用類(lèi)似形式表示歸一化的四元數(shù):
qˉˉ=(s? in(φ)n? ,cos(φ))
qˉ=(s→in(φ)n→,cos(φ))
也就是實(shí)部現(xiàn)在使用 cos(φ)cos(φ)表示,虛部使用 sin(φ)n? sin(φ)n→表示,其中 n? n→是歸一化的三維矢量,由于 a? ?b? =|a? ||b? |cos(θab)a→?b→=|a→||b→|cos(θab),因此有 n? ?n? =1n→?n→=1。讓我們嘗試計(jì)算此時(shí)的模:
|qˉˉ|=w2+u? ?u? ????????√=cos(φ)2+sin(φ)2(n? ?n? )???????????????????√=1
|qˉ|=w2+u→?u→=cos(φ)2+sin(φ)2(n→?n→)=1
四元數(shù)映射_實(shí)數(shù)
我們可以將實(shí)數(shù)映射到四元數(shù)空間,所謂的映射,也就是說(shuō)1對(duì)1的找到相應(yīng)的存在,并且在不同空間施加施加相對(duì)應(yīng)運(yùn)算的法則時(shí)獲得相同的結(jié)果。
例如,對(duì)應(yīng)實(shí)數(shù)w,嘗試進(jìn)行如下映射:
qˉˉ=(0? ,w)
qˉ=(0→,w)
那么是否能夠遵守相應(yīng)的運(yùn)算法則?也就是說(shuō),如果實(shí)數(shù) wawa與實(shí)數(shù) wbwb均被映射到了四元數(shù)空間,那么它們的加法和乘法的結(jié)果是否還能映射回去,與原始空間的運(yùn)算獲得相同的結(jié)果?加法顯然可以,這里進(jìn)行乘法計(jì)算測(cè)試:
qˉˉa=(0? ,wa)
qˉa=(0→,wa)
qˉˉb=(0? ,wb)
qˉb=(0→,wb)
qˉˉaqˉˉb=(0? ,wa)(0? ,wb)=wawb?0? ?0? +wa0? +wb0? +0? ×0?
qˉaqˉb=(0→,wa)(0→,wb)=wawb?0→?0→+wa0→+wb0→+0→×0→
=>
qˉˉaqˉˉb=wawb+0? =(0? ,wawb)
qˉaqˉb=wawb+0→=(0→,wawb)
顯然,依照映射原則,可以將 (0? ,wawb)(0→,wawb)映射回去變成 wawa wbwb,與實(shí)數(shù)空間的計(jì)算結(jié)果相同。因此,此映射法則是可行的:
qˉˉ=(0? ,w)
qˉ=(0→,w)
四元數(shù)映射_矢量直接映射
與實(shí)數(shù)映射類(lèi)似,我們也可以嘗試將三維矢量映射到四元數(shù)。
對(duì)于矢量 v? v→映射法則如下:
qˉˉ=(v? ,0)
qˉ=(v→,0)
同樣,加法運(yùn)算顯然可以映射回去,我們來(lái)計(jì)算乘法運(yùn)算。
qˉˉa=(v? a,0)
qˉa=(v→a,0)
qˉˉb=(v? b,0)
qˉb=(v→b,0)
qˉˉaqˉˉb=(v? a,0)(v? b,0)=00?va→?vb→+0vb→+0va→+va→×vb→
qˉaqˉb=(v→a,0)(v→b,0)=00?va→?vb→+0vb→+0va→+va→×vb→
=>
qˉˉaqˉˉb=(va→×vb→,?v? a?v? b)
qˉaqˉb=(va→×vb→,?v→a?v→b)
可以看到,此時(shí)出現(xiàn)了之前兩個(gè)四元數(shù)中均不存在的實(shí)部。因此這個(gè)映射法則是錯(cuò)誤的。(本身兩個(gè)向量之間如果直接使用多對(duì)多的格拉斯曼積式乘法也是沒(méi)有意義的,所以結(jié)果可想而知。那么,是不是就不能映射矢量了?不是,只是映射法則錯(cuò)誤。回想之前在在復(fù)數(shù)中也曾使用過(guò)格拉斯曼積式的乘法 如果矢量用 e=cos(φ)+sin(φ)ie=cos(φ)+sin(φ)i表示,那么此時(shí)的 ee表示了一個(gè)二維旋轉(zhuǎn),向量的旋轉(zhuǎn)可以使用格拉斯曼積形式的復(fù)數(shù)乘法e1?e2e1?e2表示,因此,映射法則應(yīng)該與角度相關(guān)。)
四元數(shù)映射_矢量間接映射
同態(tài)
先考慮一個(gè)同態(tài)概念:假設(shè)M,M′是兩個(gè)乘集,也就是說(shuō)M和M′是兩個(gè)各具有一個(gè)封閉的具有結(jié)合律的運(yùn)算與的代數(shù)系統(tǒng)。φ是M射到M′的映射,并且任意兩個(gè)元的乘積的像是這兩個(gè)元的像的乘積,即對(duì)于M中任意兩個(gè)元a,b,滿(mǎn)足
φ(a*b)=φ(a)φ(b);
也就是說(shuō),當(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)該滿(mǎn)足以下要求:
①、旋轉(zhuǎn)完的矢量長(zhǎng)度應(yīng)該保持不變。也就是
|φ(A)|=|A|
|φ(A)|=|A|
②、假如對(duì)向量A和B都執(zhí)行φ旋轉(zhuǎn),那么向量A、B的夾角θ應(yīng)該與φ(A)、φ(B)的夾角應(yīng)該相同。由矢量點(diǎn)積我們知道 A?B=|A||B|cos(θ)A?B=|A||B|cos(θ),在滿(mǎn)足①的情況下,也就是模的乘積已經(jīng)不變,那么如果點(diǎn)積結(jié)果相同,也就能保證角度不變,也就是:
φ(A)?φ(B)=A?B
φ(A)?φ(B)=A?B
③、假如對(duì)向量A和B都執(zhí)行φ旋轉(zhuǎn),那么旋轉(zhuǎn)完畢的φ(A)、φ(B)的相對(duì)方向關(guān)系與A、B應(yīng)該保持一致,也就是所謂的手向性應(yīng)該保持一致(比如原來(lái)A的正左側(cè)恰好B,旋轉(zhuǎn)完畢應(yīng)該還是在正左側(cè),僅有夾角是不夠的,正右側(cè)也是90度關(guān)系)。假如滿(mǎn)足下面的式子,則手向性不變
φ(A)×φ(B)=A×B
φ(A)×φ(B)=A×B
接著,我們?cè)敿?xì)了解間接映射的步驟。如下圖所示:
我們通過(guò)間接映射將矢量V映射到四元數(shù),先如直接映射那樣,映射成一個(gè)純虛四元數(shù),即 (V? ,0)(V→,0),再執(zhí)行φ()變換。簡(jiǎn)寫(xiě)為
φ(V)
φ(V)
由于
AB=wawb?ua?ub+wa?ub+wb?ua+ua×ub
AB=wawb?ua?ub+wa?ub+wb?ua+ua×ub
此時(shí)的 A、BA、B均是純虛四元數(shù),因此 wa=wb=0wa=wb=0,可以簡(jiǎn)化為
AB=?ua?ub+ua×ub
AB=?ua?ub+ua×ub
由于 A、BA、B均是純虛四元數(shù),因此 A?B=ua?ubA?B=ua?ub,再由于四元數(shù)叉積和矢量叉積等價(jià),因此上式可以轉(zhuǎn)化為
AB=?A?B+A×B
AB=?A?B+A×B
如果存在這樣的同態(tài)函數(shù)函數(shù):
φ(A)φ(B)=φ(AB)
φ(A)φ(B)=φ(AB)
也就能滿(mǎn)足②、③的要求。
[此處還可以解釋得更明確,不過(guò)太過(guò)復(fù)雜了]
旋轉(zhuǎn)四元數(shù)
最后,給出旋轉(zhuǎn)四元數(shù),也就是一直在追求的φ()函數(shù)。
qˉˉ=(s? in(θ2)n? ,cos(θ2))
qˉ=(s→in(θ2)n→,cos(θ2))
它的含義是圍繞 n? n→軸旋轉(zhuǎn) θθ角度。 具體旋轉(zhuǎn)的方法使用以下函數(shù):
pˉˉˉ,=qˉˉpˉˉˉqˉˉ?
pˉ,=qˉpˉqˉ?
其中 pˉˉˉpˉ是被旋轉(zhuǎn)四元數(shù), pˉˉˉ,pˉ,是結(jié)果四元數(shù)。這里的 qˉˉ?qˉ?寫(xiě)成 qˉˉ?1qˉ?1也是可以的,因?yàn)楦鶕?jù)前述對(duì)逆的計(jì)算,對(duì)于此時(shí)模為1的 qˉˉqˉ來(lái)說(shuō),它們結(jié)果相同的。 具體推究方法以及證明方法過(guò)于復(fù)雜,就不在這里給出了。
總結(jié)
四元數(shù)是高階復(fù)數(shù)的數(shù)學(xué),它用在游戲中的作用主要是計(jì)算三維矢量的旋轉(zhuǎn),它使用先將矢量映射到純虛四元數(shù),再應(yīng)用形如 pˉˉˉ,=qˉˉpˉˉˉqˉˉ?,qˉˉ=(s? in(θ2)n? ,cos(θ2))pˉ,=qˉpˉqˉ?,qˉ=(s→in(θ2)n→,cos(θ2))的旋轉(zhuǎn)函數(shù)。最后可以達(dá)成旋轉(zhuǎn)目的。
前面的四元數(shù)性質(zhì)不甚了解也沒(méi)有太大關(guān)系,大概了解到是如何映射的也就可以了。甚至在Unity編程過(guò)程中你對(duì)四元數(shù)的映射關(guān)系不了解都無(wú)所謂。后續(xù)文章中我再介紹具體的用法。
總結(jié)
以上是生活随笔為你收集整理的四元数(Quaternion)和欧拉角(Eulerangle)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 移动平台商家支付宝如何获取商户私钥,支付
- 下一篇: GameObject数组逐渐消失