關(guān)于在坐標(biāo)系中旋轉(zhuǎn)平移物體的理論基礎(chǔ)解析
寫在前面
前幾日固體物理老師講了一大堆關(guān)于坐標(biāo)變換的內(nèi)容,聽的也是稀里糊涂。又和同學(xué)討論了一下如果一個(gè)物體圍繞坐標(biāo)系中任意軸進(jìn)行旋轉(zhuǎn),那么該如何計(jì)算其的旋轉(zhuǎn)矩陣?于是思考了一會(huì)我就想出了一個(gè)自認(rèn)為比較完善的方法,那就是將一個(gè)復(fù)雜的旋轉(zhuǎn)操作拆分成幾步基礎(chǔ)旋轉(zhuǎn)操作,然后依次寫出旋轉(zhuǎn)矩陣后按照順序相乘即可。
其實(shí)這也是一種比較常見的做法,但因?yàn)槭亲约禾剿鞯降?,所以就對此比較上心,為了能夠?qū)⑵浔憩F(xiàn)得更加形象直觀,我也決定利用MATLAB和Python將其實(shí)現(xiàn)。
旋轉(zhuǎn)矩陣的理論解釋
因?yàn)檫@一段公式可能會(huì)比較多,所以我就直接放截圖了,這樣子也比較方便。

以上我們得到了三個(gè)旋轉(zhuǎn)矩陣,分別是繞x軸旋轉(zhuǎn),繞y軸旋轉(zhuǎn),繞z軸旋轉(zhuǎn),下面我們開始定義操作。
定義旋轉(zhuǎn)操作
旋轉(zhuǎn)單次
我們定義:
- 繞x軸旋轉(zhuǎn)為操作A;
- 繞y軸旋轉(zhuǎn)為操作B;
- 繞z軸旋轉(zhuǎn)為操作C。

如果一個(gè)物體R想要繞x軸旋轉(zhuǎn)t角度,得到一個(gè)新的物體位置R',我們可以寫為
R' = A(t)R
其中R與R'就是坐標(biāo)向量,A與R之間是向量乘法,A(t)代表的是繞x軸轉(zhuǎn)角度t。
當(dāng)然,一個(gè)物體不可能只有一個(gè)坐標(biāo)點(diǎn),如果存在多個(gè)坐標(biāo)點(diǎn)R1,R2,R3,那么就一一乘上A(t)即可,也就是R1'=A(t)R1, R2'=A(t)R2, R3'=A(t)R3,最后得到新的物體的三個(gè)坐標(biāo)點(diǎn)R1', R2', R3'。
連續(xù)多次旋轉(zhuǎn)
如果我們想讓這個(gè)物體首先繞x軸旋轉(zhuǎn)角度t1,然后再繞y軸旋轉(zhuǎn)角度t2,再繞z軸旋轉(zhuǎn)角度t3,那么我們該怎么寫?
我們一步一步看,首先是繞x軸旋轉(zhuǎn)角度t1,公式為R'=A(t1)R。此時(shí)旋轉(zhuǎn)后的物體的坐標(biāo)是R'。
然后是繞y軸旋轉(zhuǎn)角度t2,公式為R''=B(t2)R'。此時(shí)旋轉(zhuǎn)后的物體的坐標(biāo)是R''。
最后是繞z軸旋轉(zhuǎn)角度r3,公式為R'''=C(t3)R''。此時(shí)旋轉(zhuǎn)后的物體的坐標(biāo)是R'''。
也就是說后一個(gè)操作是對當(dāng)前物體的坐標(biāo)進(jìn)行操作。
那么我們兩個(gè)兩個(gè)看,聯(lián)立前兩個(gè),先繞x軸t1角度再繞y軸t2角度,公式為R''=B(t2)R'=B(t2)A(t1)R。從公式中看這兩步操作實(shí)際上是對R乘了兩個(gè)矩陣B(t2)和A(t1),這樣就變成了R''。
注意,操作按照先后次序,右邊的矩陣為先操作,左邊的矩陣為后操作。
那么同理我們可以得到旋轉(zhuǎn)三次后的坐標(biāo)R'''=C(t3)B(t2)A(t1)R。
同理,如果存在多次操作,我們只需要按照順序不斷的左乘旋轉(zhuǎn)矩陣就好。
進(jìn)階操作
不繞xyz軸旋轉(zhuǎn),過原點(diǎn)繞任意軸進(jìn)行多次旋轉(zhuǎn)
如圖,我們要將物體繞著直線z=y按右手方向旋轉(zhuǎn)30度,這種情況就相對比較復(fù)雜了,因?yàn)樗⒉皇莤yz軸,所以我們旋轉(zhuǎn)時(shí)有以下三步操作:
將坐標(biāo)系進(jìn)行旋轉(zhuǎn)操作,令$z=y$與原z軸重合,原z軸操作后的位置為z'軸;
將物體繞z軸按右手方向旋轉(zhuǎn)30度;
將坐標(biāo)系進(jìn)行旋轉(zhuǎn)操作,令z'軸與原z軸重合。

正如上圖,左邊為原坐標(biāo)系,右邊為繞x軸旋轉(zhuǎn)45度后的新坐標(biāo)系,其中旋轉(zhuǎn)過后的坐標(biāo)系為xy'z',我們想要繞著轉(zhuǎn)的直線(原z=y)現(xiàn)在變成了z軸,那么這樣子就變成了繞z軸旋轉(zhuǎn)的情況。
所以我們將繞x軸旋轉(zhuǎn)坐標(biāo)系的操作記為A(45),所以物體現(xiàn)在的坐標(biāo)為$R'=A(45)R$。
之后我們就可以將物體繞z軸右手方向旋轉(zhuǎn)30度了,操作記為B(30),所以現(xiàn)在物體的坐標(biāo)為$R''=B(30)R'$。
但是此時(shí)我們的坐標(biāo)系還是以原z=y為z軸的坐標(biāo)系,我們需要把z'軸轉(zhuǎn)過來,變成最初的那個(gè)樣子,所以我們需要把坐標(biāo)系繞x軸旋轉(zhuǎn)-45度,這樣子z'就和z重合了,z=y也回到了原來的位置。
所以這一步操作記為A(-45),物體現(xiàn)在的坐標(biāo)為R'''=A(-45)R''。
最后總的來說,這個(gè)物體從最初的狀態(tài)到最后的狀態(tài)相當(dāng)于進(jìn)行了三步操作,乘上了三個(gè)矩陣,即R'''=A(-45)B(30)A(45)R.
圍繞軸不經(jīng)過原點(diǎn)的旋轉(zhuǎn)-初級
上面的方法全部都要經(jīng)過原點(diǎn),但如果我們想要圍著轉(zhuǎn)的對稱軸不經(jīng)過原點(diǎn)呢?這就要多加一個(gè)操作了,那就是給坐標(biāo)加上個(gè)某一個(gè)值,比如我有坐標(biāo)向量(x, y, z),想要向x軸平移1單位,那么新的坐標(biāo)就變成了(x+1, y, z),相當(dāng)于進(jìn)行了如下操作
(x', y', z') = (x, y, z) + (1, 0, 0)
所以我們這里定義一個(gè)新操作D(a,x)。其中a代表沿著位移方向的軸,方向只有三個(gè),xyz。x代表的是唯一的距離,比如說上述操作就可以寫為D(x,1),總的公式為R'=R+D(x,1)。
圍繞軸不經(jīng)過原點(diǎn)的旋轉(zhuǎn)-高級
我們現(xiàn)在要將一個(gè)物體R繞著z=y-1這條線為軸右手方向旋轉(zhuǎn)30度。其實(shí)步驟依舊和上面一模一樣,只不過將z=y-1轉(zhuǎn)到z軸上更為麻煩了而已,主要分為以下步驟。

首先將z=y-1平移到經(jīng)過原點(diǎn),也就是將坐標(biāo)軸向y方向平移-1個(gè)單位,即操作D(y,1),平移后的物體坐標(biāo)為R'=R+D(y,-1)。
然后就是之前舉的例子了,我們直接可以寫得(我用R2代替R'',以此類推)
R2=A(45)R'
R3=B(30)R2
R4=A(-45)R3
最后到了這里我們還得把z=y-1移到原來位置,也就是再加上一個(gè)D(y,1)操作,也就是
R5=R4+D(y,-1)
=A(-45)B(30)A(45)[R+D(y,-1)]+D(y,1)
這樣子,我們就可以實(shí)現(xiàn)任何操作
總結(jié)
可以看出,我們最終達(dá)到實(shí)現(xiàn)任何操作的步驟為三步
將我們想要旋轉(zhuǎn)的軸通過旋轉(zhuǎn)與平移操作將其與任一坐標(biāo)軸重合;
進(jìn)行我們想要繞著旋轉(zhuǎn)軸旋轉(zhuǎn)的操作;
將旋轉(zhuǎn)軸通過旋轉(zhuǎn)與平移操作移動(dòng)到原來的位置。
并且我們的基礎(chǔ)操作總共有4個(gè),其中三個(gè)旋轉(zhuǎn)一個(gè)平移,分別為:
繞x軸右手方向旋轉(zhuǎn)t角度記為A(t);
繞y軸右手方向旋轉(zhuǎn)t角度記為B(t);
繞z軸右手方向旋轉(zhuǎn)t角度記為C(t);
沿某一軸(記為a軸)正方向平移x距離記為D(a, x)。
這樣子我們得到的坐標(biāo)就是我們實(shí)現(xiàn)了當(dāng)前操作的坐標(biāo)。
下一篇文章講利用編程實(shí)現(xiàn)這些操作。