四元數與旋轉
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
在討論「四元數(shù)」之前,我們來想想對三維直角座標而言,在物體旋轉(zhuǎn)會有何影響,可以擴充三維直角座標系統(tǒng)的旋轉(zhuǎn)為三角度系統(tǒng)(Three-angle system),在Game Programming Gems中有提供這麼一段:
Quaternions do not suffer from gimbal lock. With a three-angle(roll, pitch, yaw) system, there are always certain orientations in which there is no simple change to the trhee values to represent a simple local roation. You often see this rotation having "pitched up" 90 degree when you are trying to specify a local yaw for right.
簡單的說,三角度系統(tǒng)無法表現(xiàn)任意軸的旋轉(zhuǎn),只要一開始旋轉(zhuǎn),物體本身即失去對任意軸的自主性。
四元數(shù)(Quaternions)為數(shù)學(xué)家Hamilton於1843年所創(chuàng)造的,您可能學(xué)過的是複數(shù),例如:a + b i 這樣的數(shù),其中i * i = -1,Hamilton創(chuàng)造了三維的複數(shù),其形式為 w + x i + y j + z k,其中i、j、k的關(guān)係如下:
i2 = j2 = k2 = -1
i * j = k = -j * i
j * k = i = -k * j
k * i = j = -i * k
假設(shè)有兩個四元數(shù):
q1 = w1 + x1 i + y1 j + z1 k
q2 = w2 + x2 i + y2 j + z2 k
四元數(shù)的加法定義如下:
q1 + q2 = (w1+w2) + (x1+x2) i + (y1+y2) j + (z1+z2) k
四元數(shù)的乘法定義如下,利用簡單的分配律就是了:
q1 * q2 =
(w1*w2 - x1*x2 - y1*y2 - z1*z2) +
(w1*x2 + x1*w2 + y1*z2 - z1*y2) i +
(w1*y2 - x1*z2 + y1*w2 + z1*x2) j +
(w1*z2 + x1*y2 - y1*x2 + z1*w2) k
由於q = w + x i + y j + z k中可以分為純量w與向量x i + y j + z k,所以為了方便表示,將q表示為(S, V),其中S表示純量w,V表示向量x i + y j + z k,所以四元數(shù)乘法又可以表示為:
q1 * q2 = (S1 + V1)*(S2 + V2) = S1*S2 - V1.V2 + V1XV2 + S1*V2 + S2*V1
其中V1.V2表示向量內(nèi)積,V1XV2表示向量外積。
定義四元數(shù)q = w + x i + y j +z k 的norm為:
N(q) = |q| = x2 + y2 + z2 + w2
滿足N(q) = 1的四元數(shù)集合,稱之為單位四元數(shù)(Unit quaternions)。
定義四元數(shù)定義四元數(shù)q = w + x i + y j +zk的共軛(Conjugate)為:
q* = 定義四元數(shù)q = w - x i - y j -z k = [S - V]
定義四元數(shù)的倒數(shù)為:
1/ q = q* / N(q)
說明了一些數(shù)學(xué),您所關(guān)心的或許是,四元數(shù)與旋轉(zhuǎn)究竟有何關(guān)係,假設(shè)有一任意旋轉(zhuǎn)軸的向量A(Xa, Ya, Za)與一旋轉(zhuǎn)角度θ,如下圖所示:
可以將之轉(zhuǎn)換為四元數(shù):
x = s * Xa
y = s * Xb
z = s * Xc
w = cos(θ/2)
s = sin(θ/2)
所以使用四元數(shù)來表示的好處是:我們可以簡單的取出旋轉(zhuǎn)軸與旋轉(zhuǎn)角度。
那麼四元數(shù)如何表示三維空間的任意軸旋轉(zhuǎn)?假設(shè)有一向量P(X, Y, Z)對著一單位四元數(shù)q作旋轉(zhuǎn),則將P視為無純量的四元數(shù)X i + Y j + Z k,則向量的旋轉(zhuǎn)經(jīng)導(dǎo)證如下:
Rot(P) = q p q*
四元數(shù)具有純量與向量,為了計算方便,將之以矩陣的方式來表現(xiàn)四元數(shù)的乘法,假設(shè)將四元數(shù)表示如下:
q = [w, x, y, z] = [S, V]
兩個四元數(shù)相乘q" = q * q'的矩陣表示法如下所示:
若令q = [S, V] = [cosθ, u*sinθ],其中u為單位向量,而令q'= [S', V']為一四元數(shù),則經(jīng)過導(dǎo)證,可以得出q * q' * q^(-1)會使得q'繞著u軸旋轉(zhuǎn)2θ。
由四元數(shù)的矩陣乘法與四元數(shù)的旋轉(zhuǎn),可以導(dǎo)證出上面的旋轉(zhuǎn)公式可以使用以下的矩陣乘法來達成:
講了這麼多,其實就是要引出上面這個矩陣乘法,也就是說如果您要讓向量(x', y', z')(w'為0)對某個單位向量軸u(x, y, z)旋轉(zhuǎn)角度2θ,則w = cosθ,代入以上的矩陣乘法,即可得旋轉(zhuǎn)後的(x", y", z"),如果為了方便,轉(zhuǎn)換矩陣的最下列與最右行會省略不寫出來,而如下所示:
關(guān)於四元數(shù)的其它說明,您可以參考 向量外積與四元數(shù) 這篇文章。
關(guān)於旋轉(zhuǎn)的轉(zhuǎn)換矩陣導(dǎo)證,在Game Programming Gems第二章有詳細的說明。
關(guān)於 Gimbal lock。
轉(zhuǎn)載于:https://my.oschina.net/lyr/blog/61877
總結(jié)
- 上一篇: 关于.net的垃圾回收和大对象处理_标记
- 下一篇: 解决 IE8下 vs2008 无法调试