一、欧拉角(Euler Angles)
1、定义
欧拉角是一种通过三个角度来表示物体旋转的方法。它通常用来描述物体绕三个坐标轴的旋转,通常是绕 X轴、Y轴 和 Z轴 的旋转,通常表示为 (pitch, yaw, roll)
,或 (x, y, z)
。
例如,通过欧拉角设置旋转:
Vector3 eulerAngles = new Vector3(30, 45, 60); // 表示绕 X 轴 30 度,绕 Y 轴 45 度,绕 Z 轴 60 度的旋转
2、旋转约定
- Pitch(俯仰):绕X轴旋转的角度。
- Yaw(偏航):绕Y轴旋转的角度。
- Roll(翻滚):绕Z轴旋转的角度。
3、Unity 中的欧拉角
-
在 Inspector 窗口中调节的 Rotation 就是欧拉角。
-
使用 this.transform.eulerAngles 获取或设置欧拉角。
print(this.transform.eulerAngles);
4、优缺点
4.1 优点:
- 直观、易理解。
- 存储空间小(三个数表示)。
- 可以进行从一个方向到另一个方向旋转大于180度的角度。
4.2 缺点:
(1)旋转的表示不唯一
同一旋转的表示不唯一。由于一个完整的圆周是360度(或2π弧度),因此任何角度加上或减去360度的整数倍都会得到相同的旋转效果。又因为欧拉角的角度值是可以累加的,而超过360度的角度实际上与较小的角度代表相同的旋转状态。这意味着同一个物理旋转可以由多个不同的数学表示来描述。
比如90和450度其实表示的旋转是一样。
(2)存在万向节死锁
问题(Gimbal Lock)
当某个特定轴达到特殊值时,绕一个轴旋转可能会覆盖住另一个轴的旋转,可能会失去一维自由度。
具体可以参考:【欧拉角与万向节死锁】
比如Unity中X轴达到90度时,这时候修改yz角度,都会绕旋转z轴旋转,因为发生了万向节死锁。
5、总结
因为欧拉角存在一些缺点
- 同一旋转的表示不唯一
- 万向节死锁
因此我们往往使用Quaternion四元数
来表示三维空间中的旋转信息,而不是欧拉角。
二、Quaternion四元数
四元数是数学中的一种超复数,广泛应用于计算机图形学和游戏开发中,尤其是在表示三维空间中的旋转时。它们提供了一种比欧拉角更稳定、更高效且避免了万向锁问题的方法来描述物体的旋转状态。
1、四元数概念
- 定义:四元数是一种扩展的复数形式,由一个实数部分和三个虚数部分组成,通常表示为
[W, (X, Y, Z)]
或者q = w + xi + yj + zk
。 - 构成:
- 实数部分:
W
,也称为标量部分。 - 虚数部分:
(X, Y, Z)
,可以看作是一个3D向量,代表旋转轴的方向。 - 模长为1:在实际应用中,四元数通常是单位四元数(即其模长为1),这表示它没有缩放效应,仅用于表示旋转。
- 实数部分:
2、Unity 中的四元数
在 Unity 引擎中,四元数通过 Quaternion
结构体来表示,并提供了多种初始化方法:
3、创建四元数
3.1 通过欧拉角初始化 (Quaternion.Euler
)
- 使用三个角度值(绕 X、Y 和 Z 轴的旋转角度)来创建一个新的四元数。
Quaternion q = Quaternion.Euler(45, 30, 15);
3.2 通过轴角对初始化 (Quaternion.AngleAxis
)
- 根据指定的角度和旋转轴创建一个新的四元数。
Quaternion q = Quaternion.AngleAxis(60, Vector3.right); // 绕 X 轴旋转 60 度
Quaternion q2 = Quaternion.AngleAxis(60, Vect