欧拉角(Euler)和四元数(Quaternion)

欧拉角-Euler

欧拉角是三个角度参数,它们描述了一个物体围绕三个主轴X、Y和Z顺序旋转的情况。三个角分别对应于偏航(Yaw)、俯仰(Pitch)和翻滚(Roll)。

  • 偏航(Yaw):绕Y轴的旋转,通常表示对象的左右转向。
  • 俯仰(Pitch):绕X轴的旋转,通常表示对象的上下倾斜。
  • 翻滚(Roll):绕Z轴的旋转,通常表示对象的侧倾。

使用欧拉角进行旋转操作比较直观,并且容易理解。然而,它们有一个著名的问题,即万向锁(Gimbal Lock),这是由于旋转顺序导致旋转自由度的丧失所引起的现象。

四元数- Quaternion

四元数是一种复数的扩展,用于在三维空间中表示旋转。

四元数有四个分量:一个实部和三个虚部,通常写为 [w, x, y, z] 或 [x, y, z, w] 的形式。

与欧拉角相比,四元数有几个优点:

  • 不受万向锁的影响:四元数可以避免万向锁的问题,因此在动画插值时更加稳定。
  • 更适合插值:四元数之间的插值(如球面线性插值,SLERP)更为平滑且计算效率更高,在实现平滑动画和相机运动时特别有用。
  • 计算更高效:四元数在某些情况下比使用3x3矩阵或者4x4矩阵的旋转表示更节省内存和计算资源。

在四元数中,w 是实部,而 x、y 和 z 分量构成了四元数的虚部。四元数通常表示为
一般式

 q = w + xi + yj + zk
 i²=j²=k²=ijk=−1

其中 ( i )、( j ) 和 ( k ) 是四元数代数中的基本单位。
有序对

q=[s, v]或[s,xi+yj+zk]s,x,y,z∈R
我们可以理解为s表示的实部,向量 v 表示的就是三维空间

四元数用于三维空间中的旋转,其优点包括避免万向锁(Gimbal Lock)和提供平滑的插值(比如球面线性插值,SLERP)。在旋转的上下文中,四元数的 w 分量和虚部分量 x、y 和 z 一起工作来定义旋转的轴和角度。实际上,一个单位四元数(长度或范数为1的四元数)可以表示为:

[ q = \cos(\frac{\theta}{2}) + (xi + yj + zk) \sin(\frac{\theta}{2}) ]

这里,( x, y, z ) 定义了旋转轴的方向,而 ( \theta ) 是围绕该轴的旋转角度。w 分量,即 ( \cos(\frac{\theta}{2}) ),提供了关于旋转角度大小的信息。当四元数的范数为1时,它被称为单位四元数,才能表示空间中的旋转。

在图形和游戏编程中,四元数不直接与可视对象的属性对应,而是通过内部计算来影响对象的方向。因此,w 分量通常由程序员以外的人看不到,但它在幕后进行旋转运算时非常重要。

关系

在实际编程实践中,开发者可能会以欧拉角的形式指定旋转,但内部系统会将它们转换成四元数来进行计算。例如,在Three.js中,每个Object3D对象都有两个属性:.rotation(一个包含欧拉角的Euler对象)和.quaternion(一个Quaternion对象)。当你设置.rotation时,其内部会同步更新.quaternion,反之亦然。这样,你可以使用最直观的方式来设定旋转,同时保留四元数的所有计算优势。

在Three.js等框架中,通常使用四元数来处理旋转,以避免万向锁并利用四元数进行插值和其他旋转相关的操作。当你直接设置一个对象的.rotation属性时,内部实际上是在更新四元数(.quaternion),从而完成旋转的设置。

相关推荐
Amor风信子2 分钟前
华为OD机试真题---跳房子II
java·数据结构·算法
戊子仲秋19 分钟前
【LeetCode】每日一题 2024_10_2 准时到达的列车最小时速(二分答案)
算法·leetcode·职场和发展
邓校长的编程课堂21 分钟前
助力信息学奥赛-VisuAlgo:提升编程与算法学习的可视化工具
学习·算法
sp_fyf_202438 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03
人工智能·算法·机器学习·计算机视觉·语言模型·自然语言处理
Eric.Lee20211 小时前
数据集-目标检测系列- 螃蟹 检测数据集 crab >> DataBall
python·深度学习·算法·目标检测·计算机视觉·数据集·螃蟹检测
林辞忧1 小时前
算法修炼之路之滑动窗口
算法
￴ㅤ￴￴ㅤ9527超级帅2 小时前
LeetCode hot100---二叉树专题(C++语言)
c++·算法·leetcode
liuyang-neu2 小时前
力扣 简单 110.平衡二叉树
java·算法·leetcode·深度优先
penguin_bark2 小时前
LCR 068. 搜索插入位置
算法·leetcode·职场和发展
_GR2 小时前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划