旋转(矩阵篇)

疑问

  • 一个物体在一个坐标系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β010sinβ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/M0.0254或者为 M / E ≈ 39.37 M/E \approx39.37 M/E39.37
    转换过程:
    P / E = P / M ⋅ M / E P/E=P/M\cdot M/E P/E=P/MM/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/ERx(α)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/ERz(γ)n2/E=n1/ERy(β)
      其中 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=nxcosγnysinγ
      n 1 y = n y ⋅ sin ⁡ γ + n z ⋅ cos ⁡ γ = 0 n_{1y}=n_y\cdot \sin\gamma+n_z \cdot \cos\gamma=0 n1y=nysinγ+nzcosγ=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=n1xcosβ+n1zsinβ
      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=n1xsinβ+n1zcosβ=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=nxcosγnysinγ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/ERz(γ)p2/E=p1/ERy(β)
    • 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=p2Rx(θ)
    • 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=p2Ry(β)p=p1Rz(γ)

几何解法

注:先列出公式,后有时间补充证明

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=(1cosθ)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+=nTn=nxnxnynxnznxnxnynynynznynxnznynznznz
    它的特性是其他矢量乘以单位矢量 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 an+=a(nTn)=(anT)n=acos<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×=0nznynz0nxnynx0
    其特性是其他矢量与 n n n的的反对称矩阵相乘就是叉乘 n n n,即
    a ⋅ n × = a × n a\cdot n^\times=a\times n an×=a×n

旋转矩阵反求旋转轴矢量和旋转角度

已知旋转 M M M,求该旋转的旋转轴矢量 n n n和旋转角度 θ \theta θ

  • 思路:如果 n n n为旋转轴矢量,那么它与矩阵 M M M相乘得到矢量一定为其本身,因为旋转轴始终不动。
  • 求旋转轴:
    n ⋅ M = n n\cdot M=n nM=n
    所以:
    n ⋅ ( M − I ) = 0 n\cdot (M-I)=0 n(MI)=0
    其中 ( M − I ) (M-I) (MI)的秩为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θ=nmnm
  • 说明:到这,篇首的疑问一和疑问三就可解,疑问二中的第二个问题,答案是等效的。后续有时间证明。

已知一个物体运动前和运动后所有点的坐标,求该物体运动的平移矢量和旋转矩阵

  • 思路:该问题的就是将运动前的物体和运动后的物体重合,对于三维空间,只要物体中的面重合,它就会重合,需要注意面的方向,后续会说到
  • 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=A1A0
    在这里插入图片描述
    若旋转矢量为 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 (B1A1)=(B0A0)M(C1A1)=(C0A0)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 C0A0转动到 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=(1cosθB)nB++cosθB[I]3+sinθBnB×
      此时 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=(C0A0)MB+A1
      在这里插入图片描述

    • C 0 ′ A 1 C_0'A_1 C0A1转动到 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=C0H ×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=C0H C1H C0H 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=(1cosθC)nC++cosθC[I]3+sinθCnC×
      在这里插入图片描述
      任意跟随转动的点的运动为
      P ′ = ( P − H ) ⋅ M C + H P'=(P-H)\cdot M_C+H P=(PH)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=(PA0)MB+A1P=(PH)MC+H

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值