课堂目标
- 理解欧拉旋转的基本概念
- 可以灵活的使用欧拉角旋转物体
知识点
- 旋转矩阵
- 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 轴旋转θ度的行主序矩阵为:
- 绕y 轴旋转θ度的行主序矩阵为:
- 绕z 轴旋转θ度的行主序矩阵为:
上面的旋转都是物体绕坐标系基向量的一次旋转,当物体绕多个轴多次旋转的时候,就需要考虑欧拉旋转了。
3-欧拉旋转的矩阵
欧拉旋转可以用矩阵表示。
比如已知物体的欧拉旋转过程如下:
- 先绕x轴旋转Φ,得旋转矩阵R(x,Φ)
- 然后绕y轴旋转θ,得旋转矩阵R(y,θ)
- 最后绕z轴旋转ψ,得旋转矩阵R(z,ψ)
则其最终的欧拉旋转矩阵如下:
Euler(Φ,θ,ψ)=R(x,Φ)*R(y,θ)*R(z,ψ)
这个矩阵是可以直接用φ,θ,ψ的正弦、余弦值来表示。
设:
c1=cosΦ
s1=sinΦ
c2=cosθ
s2=sinθ
c3=cosψ
s3=sinψ
则Euler(Φ,θ,ψ)的矩阵形式可以写做:
欧拉旋转的顺序是决定欧拉旋转矩阵的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(横滚)三个航向角。
通过下表,我们可以看到旋转顺序带来的矩阵差异。
除了旋转顺序,旋转方式也会影响欧拉旋转。
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-从欧拉旋转矩阵中提取欧拉角
在之前的例子中我们已经知道了如何将欧拉角转换为矩阵,接下来咱们说一下如何从欧拉旋转矩阵中提取欧拉角。
欧拉旋转矩阵如下图所示:
对应不同的旋转顺序,其欧拉角的计算方式如下图所示:
注:由于反正切函数的象限问题,在实际求角时要使用atan2(y,x)方法。
7-万向节死锁(Gimbal Lock)
万向节死锁就是指欧拉旋转轴中的两个轴处于同一平面时的状态。
万向节死锁并不是说不能旋转,而是旋转维度会从三维降到二维。
详情可参考基维百科中的Gimbal lock。
参考链接: