繞任意軸旋轉的矩陣推導總結
前言
常用的幾何變換中旋轉是較為復雜的一種,最近看《Physically Based Rendering, Second Edition: From Theory To Implementation》一書涉及繞任意軸旋轉的實現,也給出了大體思路,但具體的推導過程及最後的旋轉矩陣並未直接地給出,故根據參考Animated CGEM: Rotation About an Arbitrary Axis總結(歡迎指正)。
(一)基礎
1.點乘與叉乘
點乘(dot)亦稱作內積或數量積,如圖,a·b = |a||b|cosφ
圖1:兩向量的內積
坐標形式:a = (ax, ay, az) ,b = (bx, by, bz)
a·b = axbx + ayby + azbz
叉乘(cross)亦稱作外積,如圖,叉乘滿足|a x b| = |a||b|sinφ
圖2:表示兩向量的叉積
圖3:左手系示意
由此,叉乘所得向量模為以兩叉乘向量為鄰邊構成的平行四邊形的面積大小,叉乘所得的向量與兩向量垂直,方向在左手坐標系下依左手定則,pbrt用的是左手系,故手掌與a、b向量構成的平面垂直,除拇指外四指由b轉向a,此時拇指的方向即叉乘向量的方向(左手系三個坐標軸亦按上述方法確定)
叉乘的坐標形式:a=(a1,b1,c1),b=(a2,b2,c2)
a x b = (b1c2-b2c1,c1a2-a1c2,a1b2-a2b1)
2.矩陣
對於線性變換(Linear Transformation),矩陣的三列就是在該變換下的三個坐標軸的反映,如果T是線性變換,M是對應的矩陣,那麽矩陣M(4x4)中第一列即把T應用到(1,0,0,)的結果。
在齊次空間(Homogeneous Space)下,M描述一個線性變換,將M作用到坐標系中的x軸向量(1,0,0),恰好得到M的第一列,依次類推第二列即作用到y軸的結果,最後一列表示的是位置相關的信息。
即Mx = M [ 1 0 0 0]T = [m00 m10 m20 m30]T
(二)繞任意軸旋轉的推導
直觀形象:
圖4:繞任意軸旋轉的直觀形象
v為被旋轉向量,a為給定的任意的旋轉軸
容易想象v繞a
圖5沿正面看 從a的方向往下看
推導:
圖6:各向量間的關系
下列推導在a為單位向量的情況下進行,否則得到的是錯誤的結果
如上圖,a是旋轉軸,v是被旋轉向量,v繞a旋轉θ度,旋轉平面與a垂直,vc為v沿著a方向分解的分量,v1為v沿著a的垂直方向分解的分量
以a的起點為原點;以a為豎軸;v1為橫軸(縱軸);與v1、a垂直的向量v2為縱軸(橫軸)建立坐標系,可以寫旋轉後得到的結果v’的向量表達式:
v’= vc + v1’
圖7:從正面看 俯視
易知:vc = a|v|cosα = (v·a)a
v1 = v - vc
v2 = v1 x a (註意a是單位向量,所以|v2| = |v1|)
v’= vc + v1’
v1’= |v’|cosθ·1/|v1|·v1 + |v’|sinθ·1/|v2|·v2
但由於|v1| = |v2|= |v’|,故消去後得到:v’= vc + v1cosθ + v2sinθ
再整理成矩陣形式,我們將這個矩陣應用到坐標系中,那麽就實現了原來點或向量的旋轉,最後完成旋轉再將坐標系恢復為原坐標系。
令a=(ax, ay, az), v =(1,0,0)
vc = (ax2,axay, axaz)
v1 = v - vc = (1-ax2, -axay, -axaz)
v2 = v1 x a = (0, az, -ay)
代入v’= vc + v1cosθ + v2sinθ得:
令a=(ax, ay, az), v =(0, 1, 0);令a=(ax, ay, az), v =(0, 0, 1)可得到旋轉矩陣的第二列、第三列。
最終所得到的即Goldman公式:
繞任意軸旋轉的矩陣推導總結