關於在坐標系中旋轉平移物體的理論基礎解析
關於在坐標系中旋轉平移物體的理論基礎解析
寫在前面
前幾日固體物理老師講了一大堆關於坐標變換的內容,聽的也是稀里糊塗。又和同學討論了一下如果一個物體圍繞坐標系中任意軸進行旋轉,那麼該如何計算其的旋轉矩陣?於是思考了一會我就想出了一個自認為比較完善的方法,那就是將一個複雜的旋轉操作拆分成幾步基礎旋轉操作,然後依次寫出旋轉矩陣後按照順序相乘即可。
其實這也是一種比較常見的做法,但因為是自己探索到的,所以就對此比較上心,為了能夠將其表現得更加形象直觀,我也決定利用MATLAB和Python將其實現。
旋轉矩陣的理論解釋
因為這一段公式可能會比較多,所以我就直接放截圖了,這樣子也比較方便。
以上我們得到了三個旋轉矩陣,分別是繞x軸旋轉,繞y軸旋轉,繞z軸旋轉,下面我們開始定義操作。
定義旋轉操作
旋轉單次
我們定義:
- 繞x軸旋轉為操作A;
- 繞y軸旋轉為操作B;
- 繞z軸旋轉為操作C。
如果一個物體R想要繞x軸旋轉t角度,得到一個新的物體位置R,我們可以寫為
R = A(t)R
其中R與R就是坐標向量,A與R之間是向量乘法,A(t)代表的是繞x軸轉角度t。
當然,一個物體不可能只有一個坐標點,如果存在多個坐標點R1,R2,R3,那麼就一一乘上A(t)即可,也就是R1=A(t)R1, R2=A(t)R2, R3=A(t)R3,最後得到新的物體的三個坐標點R1, R2, R3。
連續多次旋轉
如果我們想讓這個物體首先繞x軸旋轉角度t1,然後再繞y軸旋轉角度t2,再繞z軸旋轉角度t3,那麼我們該怎麼寫?
我們一步一步看,首先是繞x軸旋轉角度t1,公式為R=A(t1)R。此時旋轉後的物體的坐標是R。
然後是繞y軸旋轉角度t2,公式為R=B(t2)R。此時旋轉後的物體的坐標是R。
最後是繞z軸旋轉角度r3,公式為R=C(t3)R。此時旋轉後的物體的坐標是R。
也就是說後一個操作是對當前物體的坐標進行操作。
那麼我們兩個兩個看,聯立前兩個,先繞x軸t1角度再繞y軸t2角度,公式為R=B(t2)R=B(t2)A(t1)R。從公式中看這兩步操作實際上是對R乘了兩個矩陣B(t2)和A(t1),這樣就變成了R。
注意,操作按照先後次序,右邊的矩陣為先操作,左邊的矩陣為後操作。
那麼同理我們可以得到旋轉三次後的坐標R=C(t3)B(t2)A(t1)R。
同理,如果存在多次操作,我們只需要按照順序不斷的左乘旋轉矩陣就好。
進階操作
不繞xyz軸旋轉,過原點繞任意軸進行多次旋轉
如圖,我們要將物體繞著直線z=y按右手方向旋轉30度,這種情況就相對比較複雜了,因為它並不是xyz軸,所以我們旋轉時有以下三步操作:
- 將坐標系進行旋轉操作,令$z=y$與原z軸重合,原z軸操作後的位置為z軸;
- 將物體繞z軸按右手方向旋轉30度;
- 將坐標系進行旋轉操作,令z軸與原z軸重合。
正如上圖,左邊為原坐標系,右邊為繞x軸旋轉45度後的新坐標系,其中旋轉過後的坐標係為xyz,我們想要繞著轉的直線(原z=y)現在變成了z軸,那麼這樣子就變成了繞z軸旋轉的情況。
所以我們將繞x軸旋轉坐標系的操作記為A(45),所以物體現在的坐標為$R=A(45)R$。
之後我們就可以將物體繞z軸右手方向旋轉30度了,操作記為B(30),所以現在物體的坐標為$R=B(30)R$。
但是此時我們的坐標系還是以原z=y為z軸的坐標系,我們需要把z軸轉過來,變成最初的那個樣子,所以我們需要把坐標系繞x軸旋轉-45度,這樣子z就和z重合了,z=y也回到了原來的位置。
所以這一步操作記為A(-45),物體現在的坐標為R=A(-45)R。
最後總的來說,這個物體從最初的狀態到最後的狀態相當於進行了三步操作,乘上了三個矩陣,即R=A(-45)B(30)A(45)R.
圍繞軸不經過原點的旋轉-初級
上面的方法全部都要經過原點,但如果我們想要圍著轉的對稱軸不經過原點呢?這就要多加一個操作了,那就是給坐標加上個某一個值,比如我有坐標向量(x, y, z),想要向x軸平移1單位,那麼新的坐標就變成了(x+1, y, z),相當於進行了如下操作
(x, y, z) = (x, y, z) + (1, 0, 0)
所以我們這裡定義一個新操作D(a,x)。其中a代表沿著位移方向的軸,方向只有三個,xyz。x代表的是唯一的距離,比如說上述操作就可以寫為D(x,1),總的公式為R=R+D(x,1)。
圍繞軸不經過原點的旋轉-高級
我們現在要將一個物體R繞著z=y-1這條線為軸右手方向旋轉30度。其實步驟依舊和上面一模一樣,只不過將z=y-1轉到z軸上更為麻煩了而已,主要分為以下步驟。
首先將z=y-1平移到經過原點,也就是將坐標軸向y方向平移-1個單位,即操作D(y,1),平移後的物體坐標為R=R+D(y,-1)。
然後就是之前舉的例子了,我們直接可以寫得(我用R2代替R,以此類推)
R2=A(45)R
R3=B(30)R2
R4=A(-45)R3
最後到了這裡我們還得把z=y-1移到原來位置,也就是再加上一個D(y,1)操作,也就是
R5=R4+D(y,-1)
=A(-45)B(30)A(45)[R+D(y,-1)]+D(y,1)這樣子,我們就可以實現任何操作
總結
可以看出,我們最終達到實現任何操作的步驟為三步
- 將我們想要旋轉的軸通過旋轉與平移操作將其與任一坐標軸重合;
- 進行我們想要繞著旋轉軸旋轉的操作;
- 將旋轉軸通過旋轉與平移操作移動到原來的位置。
並且我們的基礎操作總共有4個,其中三個旋轉一個平移,分別為:
- 繞x軸右手方向旋轉t角度記為A(t);
- 繞y軸右手方向旋轉t角度記為B(t);
- 繞z軸右手方向旋轉t角度記為C(t);
- 沿某一軸(記為a軸)正方向平移x距離記為D(a, x)。
這樣子我們得到的坐標就是我們實現了當前操作的坐標。
下一篇文章講利用編程實現這些操作。
推薦閱讀:
※video播放部分更新
※如何學好c語言?
※簡化深度學習實踐流程:新鮮出爐的TensorFlow項目模板來了
※雲時代的編程模式將會走向何方?