3D数学与游戏:四元数与旋转

这篇文章为中文繁体,但看起来还是很容易的,内容很好。值得推荐:

Computer Graphics: 四元數與旋轉

在討論「四元數」之前,我們來想想對三維直角座標而言,在物體旋轉會有何影響,可以擴充三維直角座標系統的旋轉為三角度系統(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.


簡單的說,三角度系統無法表現任意軸的旋轉,只要一開始旋轉,物體本身即失去對任意軸的自主性。

四元數(Quaternions)為數學家Hamilton於1843年所創造的,您可能學過的是複數,例如:a + b i 這樣的數,其中i * i = -1,Hamilton創造了三維的複數,其形式為 w + x i + y j + z k,其中i、j、k的關係如下:

i 2 = j 2 = k 2 = -1
i * j = k = -j * i
j * k = i = -k * j
k * i = j = -i * k


假設有兩個四元數:

q 1 = w 1 + x 1 i + y 1 j + z 1 k
q 2 = w 2 + x 2 i + y 2 j + z 2 k


四元數的加法定義如下:

q 1 + q 2 = (w 1+w 2) + (x 1+x 2) i + (y 1+y 2) j + (z 1+z 2) k


四元數的乘法定義如下,利用簡單的分配律就是了:

q1 * q2 =
(w1*w2 - x1*x2 - y1*y2 - z1*z2) +
(w 1 *x 2 + x 1 *w 2 + y 1 *z 2 - z 1 *y 2 ) i +
(w 1 *y 2 - x 1 *z 2 + y 1 *w 2 + z 1 *x 1 ) j +
(w 1 *z 2 + x 1 *y 2 - y 1 *x 2 + z 1 *w 2 ) 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,所以四元數乘法又可以表示為:

q1 * q2 = (S 1 + V 1 )*(S 2 + V 2 ) = S 1 *S 2 - V 1 .V 2 + V 1 XV 2 + S 1 *V 2 + S 2 *V 1


其中V1.V2表示向量內積,V1XV2表示向量外積。

定義四元數q = w + x i + y j +z k 的norm為:

N(q) = |q| = x 2 + y 2 + z 2 + w 2


滿足N(q) = 1的四元數集合,稱之為單位四元數(Unit quaternions)。

定義四元數定義四元數q = w + x i + y j +zk的共軛(Conjugate)為:

q* = 定義四元數q = w - x i - y j -z k = [S - V]


定義四元數的倒數為:

1/ q = q* / N(q)


說明了一些數學,您所關心的或許是,四元數與旋轉究竟有何關係,假設有一任意旋轉軸的向量A(Xa, Ya, Za)與一旋轉角度θ,如下圖所示:


可以將之轉換為四元數:

x = s * Xa
y = s * Xb
z = s * Xc
w = cos(θ/2)
s = sin(θ/2)


所以使用四元數來表示的好處是:我們可以簡單的取出旋轉軸與旋轉角度。

在这里,我将自己加一个上面公式的反推导,我们将根据四元数求我们用于旋转它的向量A(Xa, Ya, Za)。

公式如下:

      θ =acos(w)*2

              s=sin(θ/2)

      Xa=x/s

      Xb=y/s

      Xc=c/s

这个公式在编程当中也很有用,至于有什么用,偶现在还不清楚。


那麼四元數如何表示三維空間的任意軸旋轉?假設有一向量P(X, Y, Z)對著一單位四元數q作旋轉,則將P視為無純量的四元數X i + Y j + Z k,則向量的旋轉經導證如下:

Rot(P) = q p q*


四元數具有純量與向量,為了計算方便,將之以矩陣的方式來表現四元數的乘法,假設將四元數表示如下:

q = [w, x, y, z] = [S, V]


兩個四元數相乘q" = q * q'的矩陣表示法如下所示:

若令q = [S, V] = [cosθ, u*sinθ],其中u為單位向量,而令q'= [S', V']為一四元數,則經過導證,可以得出q * q' * q^(-1)會使得q'繞著u軸旋轉2θ。

由四元數的矩陣乘法與四元數的旋轉,可以導證出上面的旋轉公式可以使用以下的矩陣乘法來達成:


講了這麼多,其實就是要引出上面這個矩陣乘法,也就是說如果您要讓向量(x', y', z')(w'為0)對某個單位向量軸u(x, y, z)旋轉角度2θ,則w = cosθ,代入以上的矩陣乘法,即可得旋轉後的(x", y", z"),如果為了方便,轉換矩陣的最下列與最右行會省略不寫出來,而如下所示:


關於四元數的其它說明,您可以參考 向量外積與四元數 這篇文章。

關於旋轉的轉換矩陣導證,在Game Programming Gems第二章有詳細的說明。

 
Gossip@caterpillar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值