欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 【零基础入门unity游戏开发——进阶篇】物体的旋转——欧拉角(Euler Angles)和 Quaternion四元数

【零基础入门unity游戏开发——进阶篇】物体的旋转——欧拉角(Euler Angles)和 Quaternion四元数

2025/2/10 1:14:05 来源:https://blog.csdn.net/qq_36303853/article/details/145149022  浏览:    关键词:【零基础入门unity游戏开发——进阶篇】物体的旋转——欧拉角(Euler Angles)和 Quaternion四元数

一、欧拉角(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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com