通过矩阵运算实现旋转
疑问
- 一个物体在一个坐标系o-xyz上,让它转动,有下面几种情况
- 情况一:只转动物体,坐标系不跟随转动。先将物体绕x轴转动30度,再绕坐标系z轴转动15度,从最终状态与开始状态对比,这个物体绕哪个直线转动了多少度?
- 情况二:坐标系会与物体一起转动,先绕z轴转动15度,再绕转动后的坐标系的x轴转动30度,那又绕哪个直线转动多少度?是否和情况一等效呢?
- 情况三:坐标系还是不和物体一起转动,让物体同时绕x轴和z轴转动,其中x轴转动30度,z轴转动15度,那又绕哪个直线转动多少度呢?
绕坐标轴的转动矩阵
注:以下数学表达式,点坐标是横式书写
绕x轴转动
R x ( α ) = [ 1 0 0 0 cos α sin α 0 − sin α cos α ] Rx(\alpha)=\left[ \begin{array}{ccc} 1 & 0 & 0\\ 0 & \cos\alpha & \sin\alpha\\ 0 & -\sin\alpha & \cos\alpha \end{array} \right ] Rx(α)=⎣⎡1000cosα−sinα0sinαcosα⎦⎤
绕y轴旋转
R y ( β ) = [ cos β 0 − sin β 0 1 0 sin β 0 cos β ] Ry(\beta)=\left[ \begin{array}{ccc} \cos\beta & 0 & -\sin\beta\\ 0 & 1 & 0\\ \sin\beta & 0 & \cos\beta \end{array} \right ] Ry(β)=⎣⎡cosβ0sinβ010−sinβ0cosβ⎦⎤
绕z轴旋转
R z ( γ ) = [ cos γ sin γ 0 − sin γ cos γ 0 0 0 1 ] Rz(\gamma)=\left[ \begin{array}{ccc} \cos\gamma & \sin\gamma & 0\\ -\sin\gamma & \cos\gamma & 0\\ 0 & 0 & 1 \end{array} \right ] Rz(γ)=⎣⎡cosγ−sinγ0sinγcosγ0001⎦⎤
坐标旋转变换与几何体旋转
- 当你用一个尺子测量你的身高,结果是178。常识告诉我们身高是178cm。为什么要写上单位,因为你量取一个东西时,都是用东西的长度除以尺子的单位长度,用下数学式表示:
L / i = 178 L/i=178 L/i=178
式中: L L L是身高, i i i是尺子的单位,常用cm。
如果用两把尺子垂直摆放,则不仅来测量你的身高,还能测量胖瘦。这样可以用两个式子表示
{ L / i = 178 W / j = 34 \left\{ \begin{array}{l} L/i=178& \\ W/j=34 \\ \end{array} \right. {L/i=178W/j=34
将两个除法写成单行矩阵的形式为:
P / M = ( L / i W / j ) = ( 178 34 ) P/M=(\begin{array}{l}L/i&W/j\end{array})=(\begin{array}{l}178&34\end{array}) P/M=(L/iW/j)=(17834)
继续扩展下去,三个尺子相互垂直摆放,来测量物体的长、宽、高:
P / M = ( L / i W / j H / k ) P/M=(\begin{array}{l}L/i&W/j&H/k\end{array}) P/M=(L/iW/jH/k)
如果放到空间,这就是一个点或者一个向量在一个坐标系中的表示。
如果把尺子的单位改成英寸,可以知道英制与公制的转换为
E / M ≈ 0.0254 E/M \approx0.0254 E/M≈0.0254或者为 M / E ≈ 39.37 M/E \approx39.37 M/E≈39.37
转换过程:
P / E = P / M ⋅ M / E P/E=P/M\cdot M/E P/E=P/M⋅M/E
这就是一种缩放的坐标变换,如果是旋转则如何? - 坐标旋转变换就是坐标之间的变化,可以用如下关系式表示
E 1 / E 2 = R x ( α ) ⋅ R y ( β ) ⋅ R z ( γ ) E_1/E_2=Rx(\alpha)\cdot Ry(\beta)\cdot Rz(\gamma) E1/E2=Rx(α)⋅Ry(β)⋅Rz(γ)
式中 E 1 E_1 E1和 E 2 E_2 E2是两个坐标, E 1 / E 2 E_1/E_2 E1/E2就是坐标变换矩阵 - 几何体旋转就是几何体在同一个坐标里旋转,可以用如下关系式表示
P 1 / E = P 0 / E ⋅ R x ( α ) ⋅ R y ( β ) ⋅ R z ( γ ) P_1/E=P_0/E \cdot Rx(\alpha)\cdot Ry(\beta)\cdot Rz(\gamma) P1/E=P0/E⋅Rx(α)⋅Ry(β)⋅Rz(γ)
绕某个矢量转动
已知某个单位矢量是 n = ( n x , n y , n z ) n=(n_x , n_y, n_z) n=(nx,ny,nz),点 p p p绕该矢量转动 θ \theta θ角度后到 p ′ p' p′,求 p ′ p' p′的坐标?或者说求这个转动向量?
代数解法
- 思路:将 n n n绕 z z z轴转动某个 γ \gamma γ角度到 x o z xoz xoz平面,此时该向量记为 n 1 n_1 n1。再将 n 1 n_1 n1绕 y y y轴转动某个 β \beta β角度与 x x x轴重合。 n n n旋转的同时, p p p也同样旋转,先转成 p 1 p_1 p1,再转成 p 2 p_2 p2。再绕 x x x轴旋转 θ \theta θ旋转得到 p 2 p_2 p2。最后, p 2 p_2 p2按 n n n的旋转反方向旋转回去,就得到 p ′ p' p′的结果。
- 推演过程如下
-
n
n
n的旋转:
n 1 / E = n / E ⋅ R z ( γ ) n 2 / E = n 1 / E ⋅ R y ( β ) n_1/E=n/E \cdot Rz(\gamma)\\ n_2/E=n_1/E \cdot Ry(\beta) n1/E=n/E⋅Rz(γ)n2/E=n1/E⋅Ry(β)
其中 n 1 n_1 n1是 n n n绕 z z z轴所得到的向量,它在 x o z xoz xoz平面上,
n 1 x = n x ⋅ cos γ − n y ⋅ sin γ n_{1x}=n_x\cdot \cos\gamma-n_y\cdot\sin\gamma n1x=nx⋅cosγ−ny⋅sinγ
n 1 y = n y ⋅ sin γ + n z ⋅ cos γ = 0 n_{1y}=n_y\cdot \sin\gamma+n_z \cdot \cos\gamma=0 n1y=ny⋅sinγ+nz⋅cosγ=0
n 1 z = n z n_{1z}=n_z n1z=nz
所以: tan γ = − n z / n y \tan\gamma=-n_z/n_y tanγ=−nz/ny
n 2 n_2 n2是 n 1 n_1 n1绕 y y y轴所得到的向量,它与 x x x轴重合,
n 2 x = n 1 x ⋅ cos β + n 1 z ⋅ sin β n_{2x}=n_{1x}\cdot\cos\beta+n_{1z}\cdot\sin\beta n2x=n1x⋅cosβ+n1z⋅sinβ
n 2 y = 0 n_{2y}=0 n2y=0
n 2 z = − n 1 x ⋅ sin β + n 1 z ⋅ cos β = 0 n_{2z}=-n_{1x}\cdot\sin\beta+n_{1z}\cdot\cos\beta=0 n2z=−n1x⋅sinβ+n1z⋅cosβ=0
所以:
tan β = n 1 z n 1 x = n z n x ⋅ cos γ − n y ⋅ sin γ \tan\beta=\frac{n_{1z}}{n_{1x}}=\frac{n_z}{n_x\cdot \cos\gamma-n_y\cdot\sin\gamma} tanβ=n1xn1z=nx⋅cosγ−ny⋅sinγnz -
p
p
p点跟随旋转
p 1 / E = p / E ⋅ R z ( γ ) p 2 / E = p 1 / E ⋅ R y ( β ) p_1/E=p/E \cdot Rz(\gamma)\\ p_2/E=p_1/E \cdot Ry(\beta) p1/E=p/E⋅Rz(γ)p2/E=p1/E⋅Ry(β) -
p
2
p_2
p2点绕
x
x
x轴旋转
θ
\theta
θ
p 2 ′ / E = p 2 ⋅ R x ( θ ) p_2'/E=p_2\cdot Rx(\theta) p2′/E=p2⋅Rx(θ) -
p
2
′
p_2'
p2′原路旋转返回
p 1 ′ = p 2 ′ ⋅ R y ( − β ) p ′ = p 1 ′ ⋅ R z ( − γ ) p_1'=p_2'\cdot Ry(-\beta)\\ p'=p_1'\cdot Rz(-\gamma) p1′=p2′⋅Ry(−β)p′=p1′⋅Rz(−γ)
-
n
n
n的旋转:
几何解法
注:先列出公式,后有时间补充证明
M = ( 1 − cos θ ) ⋅ n + + cos θ ⋅ [ I ] 3 + sin θ ⋅ n × M=(1-\cos\theta)\cdot n^+ +\cos\theta \cdot [I]_3+\sin\theta \cdot n^\times M=(1−cosθ)⋅n++cosθ⋅[I]3+sinθ⋅n×
-
n
+
n^+
n+是
n
n
n的张量:
n + = n T ⋅ n = [ n x ⋅ n x n x ⋅ n y n x ⋅ n z n y ⋅ n x n y ⋅ n y n y ⋅ n z n z ⋅ n x n z ⋅ n y n z ⋅ n z ] n^+=n^T\cdot n=\left[ \begin{array}{ccc} n_x\cdot n_x & n_x\cdot n_y & n_x\cdot n_z\\ n_y\cdot n_x & n_y\cdot n_y & n_y\cdot n_z\\ n_z\cdot n_x & n_z\cdot n_y & n_z\cdot n_z \end{array} \right ] n+=nT⋅n=⎣⎡nx⋅nxny⋅nxnz⋅nxnx⋅nyny⋅nynz⋅nynx⋅nzny⋅nznz⋅nz⎦⎤
它的特性是其他矢量乘以单位矢量 n n n的张量,结果就是该矢量在单位矢量 n n n的投影,证明:
a ⋅ n + = a ⋅ ( n T ⋅ n ) = ( a ⋅ n T ) ⋅ n = ∣ a ∣ cos < a , n > ⋅ n a\cdot n^+=a\cdot (n^T\cdot n)=(a \cdot n^T)\cdot n=|a|\cos<a,n>\cdot n a⋅n+=a⋅(nT⋅n)=(a⋅nT)⋅n=∣a∣cos<a,n>⋅n - [ I ] 3 [I]_3 [I]3是3阶单位矩阵
-
n
×
n^\times
n×是
n
n
n的反对称矩阵:
n × = [ 0 − n z n y n z 0 − n x − n y n x 0 ] n^\times=\left[ \begin{array}{ccc} 0 & -n_z & n_y\\ n_z & 0 & -n_x\\ -n_y & n_x & 0 \end{array} \right ] n×=⎣⎡0nz−ny−nz0nxny−nx0⎦⎤
其特性是其他矢量与 n n n的的反对称矩阵相乘就是叉乘 n n n,即
a ⋅ n × = a × n a\cdot n^\times=a\times n a⋅n×=a×n
旋转矩阵反求旋转轴矢量和旋转角度
已知旋转 M M M,求该旋转的旋转轴矢量 n n n和旋转角度 θ \theta θ
- 思路:如果 n n n为旋转轴矢量,那么它与矩阵 M M M相乘得到矢量一定为其本身,因为旋转轴始终不动。
- 求旋转轴:
n ⋅ M = n n\cdot M=n n⋅M=n
所以:
n ⋅ ( M − I ) = 0 n\cdot (M-I)=0 n⋅(M−I)=0
其中 ( M − I ) (M-I) (M−I)的秩为2,所以 n n n有解。求出后,再将其单位化
注:matlab求这种齐次线性方程可用null函数 - 求旋转角度:
选取某矢量与 n n n叉乘可得到垂直于 n n n的矢量 n ⊥ n^\perp n⊥,所选取的矢量一般是 x x x轴, y y y轴或 z z z轴矢量。
然后用 n ⊥ n^\perp n⊥与M相乘旋转得到另一个垂直于 n n n的矢量 m m m,这样旋转角就是 n ⊥ n^\perp n⊥与 m m m的夹角
cos θ = n ⊥ ⋅ m ∣ n ⊥ ∣ ⋅ ∣ m ∣ \cos\theta=\frac{n^\perp \cdot m}{|n^\perp| \cdot |m|} cosθ=∣n⊥∣⋅∣m∣n⊥⋅m - 说明:到这,篇首的疑问一和疑问三就可解,疑问二中的第二个问题,答案是等效的。后续有时间证明。
已知一个物体运动前和运动后所有点的坐标,求该物体运动的平移矢量和旋转矩阵
- 思路:该问题的就是将运动前的物体和运动后的物体重合,对于三维空间,只要物体中的面重合,它就会重合,需要注意面的方向,后续会说到
- 设
A
A
A,
B
B
B和
C
C
C运动前的坐标为
A
0
A_0
A0,
B
0
B_0
B0和
C
0
C_0
C0,运动后的坐标为
A
1
A_1
A1,
B
1
B_1
B1和
C
1
C_1
C1。将三角面片
A
0
B
0
C
0
A_0B_0C_0
A0B0C0和
A
1
B
1
C
1
A_1B_1C_1
A1B1C1重合,则物体就重合。需要注意点名要一一对应,因为可能存在该面片是等腰或者等边三角形的情况,这样会导致重合的方向相反。
- 物体的运动分为平移和旋转,上述讲的旋转只是单点或者矢量的旋转,可以认为乘以旋转矢量只是能够实现绕原点的旋转。因此可选取一点作为参考点,假设选取A点,那么平移矢量为
T = A 1 − A 0 T=A_1-A_0 T=A1−A0
若旋转矢量为 M M M,则存在下面的关系:
( B 1 − A 1 ) = ( B 0 − A 0 ) ⋅ M ( C 1 − A 1 ) = ( C 0 − A 0 ) ⋅ M (B_1-A_1)=(B_0-A_0)\cdot M\\(C_1-A_1)=(C_0-A_0)\cdot M (B1−A1)=(B0−A0)⋅M(C1−A1)=(C0−A0)⋅M - 旋转矢量怎么求?
分两步走:先将 B 0 A 0 B_0A_0 B0A0转动到 B 1 A 1 B_1A_1 B1A1,同时 C 0 C_0 C0同时跟随转动到 C 0 ′ C_0' C0′,再将 C 0 ′ A 0 C_0'A_0 C0′A0转动到 C 1 A 1 C_1A_1 C1A1。-
B 0 A 0 B_0A_0 B0A0转动到 B 1 A 1 B_1A_1 B1A1的转动轴 n B n_B nB为:
n B = B 1 A 1 ⃗ × B 0 A 0 ⃗ n_B=\vec{B_1A_1}\times \vec{B_0A_0} nB=B1A1×B0A0
注意 B 1 A 1 ⃗ \vec{B_1A_1} B1A1在前, B 0 A 0 ⃗ \vec{B_0A_0} B0A0在后,切不可顺序搞反。
转动角为 θ B \theta_B θB为:
c o s θ B = B 0 A 0 ⃗ ⋅ B 1 A 1 ⃗ ∣ B 0 A 0 ⃗ ∣ ⋅ ∣ B 1 A 1 ⃗ ∣ cos\theta_B=\frac{\vec{B_0A_0}\cdot \vec{B_1A_1}}{|\vec{B_0A_0}|\cdot|\vec{B_1A_1}|} cosθB=∣B0A0∣⋅∣B1A1∣B0A0⋅B1A1
所以旋转矩阵 M B M_B MB为:
M B = ( 1 − cos θ B ) ⋅ n B + + cos θ B ⋅ [ I ] 3 + sin θ B ⋅ n B × M_B=(1-\cos\theta_B)\cdot n^+_B +\cos\theta_B \cdot [I]_3+\sin\theta_B \cdot n^\times_B MB=(1−cosθB)⋅nB++cosθB⋅[I]3+sinθB⋅nB×
此时 C 0 C_0 C0旋转到 C 0 ′ C_0' C0′:
C 0 ′ = ( C 0 − A 0 ) ⋅ M B + A 1 C_0'=(C_0-A_0)\cdot M_B+A_1 C0′=(C0−A0)⋅MB+A1
-
C 0 ′ A 1 C_0'A_1 C0′A1转动到 C 1 A 1 C_1A_1 C1A1的转动轴 n C n_C nC为:
n C = C 0 ′ H → × C 0 H → n_C=\overrightarrow{C_0'H}\times \overrightarrow{C_0H} nC=C0′H×C0H
转动角为 θ C \theta_C θC为:
c o s θ C = C 0 ′ H ⃗ ⋅ C 1 H ⃗ ∣ C 0 ′ H ⃗ ∣ ⋅ ∣ C 1 H ⃗ ∣ cos\theta_C=\frac{\vec{C_0'H}\cdot \vec{C_1H}}{|\vec{C_0'H}|\cdot|\vec{C_1H}|} cosθC=∣C0′H∣⋅∣C1H∣C0′H⋅C1H
其中H是C在AB的垂足。
所以旋转矩阵 M C M_C MC为:
M C = ( 1 − cos θ C ) ⋅ n C + + cos θ C ⋅ [ I ] 3 + sin θ C ⋅ n C × M_C=(1-\cos\theta_C)\cdot n^+_C +\cos\theta_C \cdot [I]_3+\sin\theta_C \cdot n^\times_C MC=(1−cosθC)⋅nC++cosθC⋅[I]3+sinθC⋅nC×
任意跟随转动的点的运动为
P ′ = ( P − H ) ⋅ M C + H P'=(P-H)\cdot M_C+H P′=(P−H)⋅MC+H
其中 H H H为 C 0 ′ ′ C_0'' C0′′在 A 1 B 1 A_1B_1 A1B1的垂足 -
总的旋转:
P ′ = ( P − A 0 ) ⋅ M B + A 1 P ′ ′ = ( P ′ − H ) ⋅ M C + H P'=(P-A_0)\cdot M_B+A_1\\P''=(P'-H)\cdot M_C+H P′=(P−A0)⋅MB+A1P′′=(P′−H)⋅MC+H
-