来自:http://blog.miskcoo.com/2016/12/rotation-in-3d-space
考虑这样一个问题:如何计算三维空间中一个点绕着某一条向量旋转一个特定角度之后的坐标?旋转矩阵、欧拉角和四元数都是用来解决这个问题的方法。
接下来我们来讨论一下旋转矩阵和欧拉角这两个方法,并且我们选取右手坐标系作为我们的坐标系。
旋转矩阵
首先,对于一个三维空间的点 P(x,y,z) P(x,y,z),要将其绕z z
轴旋转 θ θ
角度是可以很简单地用旋转矩阵来表示的
R z (θ)=⎡ ⎣ ⎢ cosθsinθ0 −sinθcosθ0 001 ⎤ ⎦ ⎥ (1)
类似地,绕另外两个坐标轴旋转的矩阵可以表示如***意
R y Ry
有些不同)
R x (θ)=⎡ ⎣ ⎢ 100 0cosθsinθ 0−sinθcosθ ⎤ ⎦ ⎥ (2)
R y (θ)=⎡ ⎣ ⎢ cosθ0−sinθ 010 sinθ0cosθ ⎤ ⎦ ⎥ (3)
对于这三个特殊的旋转轴我们已经有了解决方案了,那么对于任意的轴
p p
要怎么办呢?我们可以将这个旋转分解:
- 将整个坐标轴旋转,使得旋转轴 p p
和 z z
轴重合
- 再将点 P P
绕 z z
轴旋转 θ θ
角
- 再将整个坐标轴旋转回原位
如图,我们可以用两个角 ϕ ϕ
和 ψ ψ
表示一个旋转轴的位置(这里认为旋转轴是个单位向量)
⎧ ⎩ ⎨ xyz =sinϕcosψ=sinϕsinψ=cosϕ (4) (4){x=sinϕcosψy=sinϕsinψz=cosϕ
这样整个旋转就可以表示如下(最先进行的旋转它对应的旋转矩阵在最右侧)
R z (ψ)R y (ϕ)R z (θ)R y (−ϕ)R z (−ψ) Rz(ψ)Ry(ϕ)Rz(θ)Ry(−ϕ)Rz(−ψ)
或者利用 R(−α)=R −1 (α)=R T (α) R(−α)=R−1(α)=RT(α),可以改写为
R z (ψ)R y (ϕ)R z (θ)R T y (ϕ)R T z (ψ) Rz(ψ)Ry(ϕ)Rz(θ)RyT(ϕ)RzT(ψ)
经过化简,就可以得到最终的旋转矩阵
⎡ ⎣ ⎢ cosθ+x 2 (1−cosθ)yx(1−cosθ)+zsinθzx(1−cosθ)−ysinθ xy(1−cosθ)−zsinθcosθ+y 2 (1−cosθ)zy(1−cosθ)+xsinθ xz(1−cosθ)+ysinθyz(1−cosθ)−xsinθcosθ+z 2 (1−cosθ) ⎤ ⎦ ⎥ (5) (5)[cosθ+x2(1−cosθ)xy(1−cosθ)−zsinθxz(1−cosθ)+ysinθyx(1−cosθ)+zsinθcosθ+y2(1−cosθ)yz(1−cosθ)−xsinθzx(1−cosθ)−ysinθzy(1−cosθ)+xsinθcosθ+z2(1−cosθ)]
我们将旋转矩阵左乘需要旋转的向量就可以得到旋转后的结果了!
旋转矩阵一个很方便的地方是它可以沿着任意轴任意角度的旋转,但是,旋转矩阵缺点是它需要有
9 9
个元素来表示一个旋转,而且矩阵的乘法也比较慢。
欧拉角
欧拉角是用三个旋转角度 α,β,γ α,β,γ
来标示旋转的。如图,图中蓝色坐标系是起始的坐标系,红色的坐标系是最后旋转完成的坐标系。整个旋转分为三个步骤:
- 将坐标系绕 z z
轴旋转 α α
角
- 将旋转后坐标系绕自己本身的 x x
轴(也就是图中的 N N
轴)旋转 β β
角
- 将旋转后坐标系绕自己本身的
z z
轴旋转 γ γ
角
由于绕不同的轴旋转所得到的欧拉角是不同的,所以欧拉角在使用的时候必须要先指明旋转的顺序,这里使用的是“zxz zxz”的顺序。
欧拉角表示的旋转转换成旋转矩阵就是
R z (α)R x (β)R z (γ) (6) (6)Rz(α)Rx(β)Rz(γ)
需要注意,这里的后面两次旋转并不是在原本固定的坐标系下的旋转。在旋转矩阵中,每一次旋转的叠加都是在左边乘上对应的旋转矩阵,然而,在这里乘法的顺序是相反的。
这可以这样来理解,假设最原始的固定的坐标系是 C 0 C0:
- 假设有一个和 C 0 C0
重合坐标系 C 3 C3,先将C 3 C3
绕 C 0 C0
的 z z
轴旋转 γ γ
角
- 假设有一个和 C 0 C0
重合坐标系 C 2 C2,将C 2 C2
和前一步旋转后的 C 3 C3
一起绕 C 0 C0
的 x x
轴旋转 β β
角
- 假设有一个和 C 0 C0
重合坐标系 C 1 C1,将C 1 C1
和前一步旋转后的 C 2 ,C 3 C2,C3
一起绕 C 0 C0
的 z z
轴旋转 α α
角
然后我们仅看这三个坐标系的关系:C 0 C0
绕自己的 z z
轴旋转 α α
角就可以和 C 1 C1
重合;C 1 C1
绕自己的 x x
轴旋转 β β
角可以和 C 2 C2
重合,这是因为 C 1 C1
和 C 2 C2
在最后一步是一起旋转的,它们的相对位置不会改变;同样可以知道
C 2 C2
绕自己的 z z
轴旋转 γ γ
角就可以和 C 3 C3
重合。
在这里 C 1 ,C 2 C1,C2
相当于是前面欧拉角旋转的前两步得到的坐标系。
这样的话从 C 0 C0
到 C 3 C3
的变换就相当于之前欧拉角的旋转变换,因此按照这个过程,旋转矩阵就是按照上面的顺序相乘了。