1. 程式人生 > >繞任意軸旋轉的矩陣推導總結

繞任意軸旋轉的矩陣推導總結

format spl 基礎 imp 平行四邊形 mage 方法 關系 建立

前言

常用的幾何變換中旋轉是較為復雜的一種,最近看《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用的是左手系,故手掌與ab向量構成的平面垂直,除拇指外四指由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為給定的任意的旋轉軸

容易想象va

旋轉一周形成一個圓錐,更明確地說,將v沿旋轉軸和垂直旋轉軸方向分解為兩個分向量,平行旋轉軸的分向量並不旋轉,是垂直分向量在平面內旋轉

技術分享技術分享

圖5沿正面看 從a的方向往下看

推導

技術分享圖6:各向量間的關系

下列推導在a為單位向量的情況下進行,否則得到的是錯誤的結果

如上圖,a是旋轉軸,v是被旋轉向量,v繞a旋轉θ度,旋轉平面與a垂直,vcv沿著a方向分解的分量,v1v沿著a的垂直方向分解的分量

a的起點為原點;以a為豎軸;v1為橫軸(縱軸);與v1a垂直的向量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/|v1v1 + |v|sinθ·1/|v2v2

但由於|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公式:

技術分享

繞任意軸旋轉的矩陣推導總結