欧拉旋转

1,047 阅读4分钟

课堂目标

  • 理解欧拉旋转的基本概念
  • 可以灵活的使用欧拉角旋转物体

知识点

  • 旋转矩阵
  • Proper Euler angles
  • Tait–Bryan angles
  • 内旋
  • 外旋
  • 从欧拉旋转矩阵中提取欧拉角
  • 万向节死锁

1-欧拉旋转的概念

关于欧拉旋转的概念,我之前在webgl 的三维世界里给大家讲过,只是那时只是让大家对欧拉旋转有一个简单认知,接下来我们会系统的说一下欧拉旋转。

欧拉旋转就是让物体按照特定旋转角度(绕x|y|z轴旋转的角度)、旋转顺序、旋转方式(内旋、外旋)旋转的方法。

根据欧拉旋转定义,我们可以知道影响欧拉旋转的三个因素:

  • 旋转角度(绕x|y|z轴旋转的角度)
  • 旋转顺序
  • 旋转方式(内旋、外旋)

接下来我们先认识一下旋转矩阵。

2-旋转矩阵

之前在webgl 的矩阵变换里跟大家说过一些旋转矩阵的基本概念。

在这里咱们重点回顾一下物体绕x,y,z轴旋转的矩阵。

已知:

  • 坐标系为右手坐标系
  • 旋转角度θ

求:

  • 绕x 轴旋转θ度的行主序矩阵
  • 绕y 轴旋转θ度的行主序矩阵
  • 绕z 轴旋转θ度的行主序矩阵

设:

c=cosθ
s=sinθ

则:

  • 绕x 轴旋转θ度的行主序矩阵为:

img

  • 绕y 轴旋转θ度的行主序矩阵为:

img

  • 绕z 轴旋转θ度的行主序矩阵为:

img

上面的旋转都是物体绕坐标系基向量的一次旋转,当物体绕多个轴多次旋转的时候,就需要考虑欧拉旋转了。

3-欧拉旋转的矩阵

欧拉旋转可以用矩阵表示。

比如已知物体的欧拉旋转过程如下:

  1. 先绕x轴旋转Φ,得旋转矩阵R(x,Φ)
  2. 然后绕y轴旋转θ,得旋转矩阵R(y,θ)
  3. 最后绕z轴旋转ψ,得旋转矩阵R(z,ψ)

则其最终的欧拉旋转矩阵如下:

Euler(Φ,θ,ψ)=R(x,Φ)*R(y,θ)*R(z,ψ)

这个矩阵是可以直接用φ,θ,ψ的正弦、余弦值来表示。

设:

c1=cosΦ
s1=sinΦ

c2=cosθ
s2=sinθ

c3=cosψ
s3=sinψ

则Euler(Φ,θ,ψ)的矩阵形式可以写做:

image-20221106212414723

欧拉旋转的顺序是决定欧拉旋转矩阵的3个因素之一,所以咱们接下来就说一下欧拉旋转的顺序。

4-欧拉旋转的顺序

欧拉旋转的顺序可分成两类:

  • Proper Euler angles (z-x-z, x-y-x, y-z-y, z-y-z, x-z-x, y-x-y)
  • Tait–Bryan angles (x-y-z, y-z-x, z-x-y, x-z-y, z-y-x, y-x-z)

我很难把Proper和Tait–Bryan 翻译成中文,所以就写英语了,详情可参考基维百科里的Euler_angles

Proper Euler angles 只涉及两个转轴。

Tait–Bryan angles 涉及三个转轴。

Tait–Bryan angles也被称为万向节角,航向角,在飞行器中应用最多,其中包含yaw(偏航), pitch(俯仰), roll(横滚)三个航向角。

img

通过下表,我们可以看到旋转顺序带来的矩阵差异。

image-20221106215927527

除了旋转顺序,旋转方式也会影响欧拉旋转。

5-欧拉旋转的方式

欧拉旋转的方式有两种:

  • 内旋:第1次旋转是基于世界坐标系旋转的,第2次、第3次旋转都是基于本地坐标系旋转的。
  • 外旋:所有的旋转都是基于世界坐标系旋转的。

在实际开发中,内旋用的是比较多的,我们之前举的矩阵例子就都是按照内旋说的。

在three.js 里的Euler对象也是按照内旋定义的。

举个例子解释一下内旋和外旋的概念。

已知:旋转的顺序为x>y>z,其旋转角度分别为Φ,θ,ψ

则:

内旋旋转结果为:

Euler(Φ,θ,ψ)=R(x,Φ)*R(y,θ)*R(z,ψ)

外旋旋转结果为:

Euler(Φ,θ,ψ)=R(z,ψ)*R(y,θ)*R(x,Φ)

由上例可知,内旋和外旋的旋转关系是互逆的。

6-从欧拉旋转矩阵中提取欧拉角

在之前的例子中我们已经知道了如何将欧拉角转换为矩阵,接下来咱们说一下如何从欧拉旋转矩阵中提取欧拉角。

欧拉旋转矩阵如下图所示:

image-20221107202928615

对应不同的旋转顺序,其欧拉角的计算方式如下图所示:

toEulerAngles

注:由于反正切函数的象限问题,在实际求角时要使用atan2(y,x)方法。

7-万向节死锁(Gimbal Lock)

img

万向节死锁就是指欧拉旋转轴中的两个轴处于同一平面时的状态。

万向节死锁并不是说不能旋转,而是旋转维度会从三维降到二维。

详情可参考基维百科中的Gimbal lock

参考链接:

en.wikipedia.org/wiki/Euler_…

en.wikipedia.org/wiki/Gimbal…

blog.csdn.net/whl0071/art…