繞任意軸旋轉的情況比較複雜,主要分為兩種情況,一種是平行於座標軸的,一種是不平行於座標軸的,對於平行於座標軸的,我們首先將旋轉軸平移至與座標軸重合,然後進行旋轉,最後再平移回去。
整個過程就是
對於不平行於座標軸的,可按如下方法處理。(該方法實際上涵蓋了上面的情況)
將旋轉軸平移至原點
將旋轉軸旋轉至yoz平面
將旋轉軸旋轉至於z軸重合
繞z軸旋轉θ度
執行步驟3的逆過程
執行步驟2的逆過程
執行步驟1的逆過程
假設用v1(a1, b2, c2)和v2(a2, b2, c2)來表示旋轉軸,θ表示旋轉角度。為了方便推導,暫時使用右手系並使用列向量,待得出矩陣後轉置一下即可,上面步驟對應的流程圖如下。
步驟1是乙個平移操作,將v1v2平移至原點,對應的矩陣為
步驟2是乙個旋轉操作,將p(p = v2 -v1)旋轉至xoz平面,步驟3也是乙個旋轉操作,將p旋轉至與z軸重合,這兩個操作對應的圖如下。
做點p在平面yoz上的投影點q。再過q做z軸垂線,則r是p繞x軸旋轉所得,且旋轉角度為α,且
於是旋轉矩陣為
現在將r繞y軸旋轉至與z軸重合,旋轉的角度為-beta(方向為順時針),且
於是得到旋轉矩陣為
最後是繞z軸旋轉,對應的矩陣如下
如果旋轉軸是過原點的,那麼第一步和最後一步的平移操作可以省略,也就是把中間五個矩陣連乘起來,再轉置一下,得到下面的繞任意軸旋轉的矩陣
即
對應的函式**如下。
void rotatearbitraryaxis(d3dxmatrix* pout, d3dxvector3* axis, floattheta)
三維空間的繞軸旋轉變換
最近在看文獻的時候看到作者有用到三維繞軸變換。我看了好久都沒摸清他的矩陣是怎麼得到的。待我提筆一畫,媽呀,果然這腦子是廢了,這麼easy的問題都他麼的解不出來。既然腦子廢了那手還是勤勞點把。嘆氣。唉,豬生艱難。我只想過吃完就睡睡完就吃的生活啊!為什麼要這麼torture我。咳,言歸正傳。首先出乙個清...
三維空間剛體旋轉
剛體 運動過程中不會產生形變的物體,運動過程中同乙個向量的長度和夾角都不會發生變化。剛體變換也稱為歐式變換。旋轉矩陣 四元數旋轉向量 尤拉角安裝方式 eigen庫只有標頭檔案,沒有.so和.a二進位制檔案,所以在cmakelists.txt中只需要新增標頭檔案路徑,並不需要使用target link...
三維空間裡乙個點繞座標軸旋轉
在三維空間裡乙個點繞x軸 y軸 z軸旋轉一定弧度後新的點的座標是容易計算的,問題是如果它所繞的旋轉軸是乙個任意向量 x,y,z 的話,怎麼知道旋轉angle弧度後新的點的座標呢?在opengl裡有乙個函式glrotatef angle,x,y,z 可以實現此功能,它的實現是左乘乙個矩陣 x2 1 c...