欧拉角(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),从而完成旋转的设置。

相关推荐
晨晖220 小时前
顺序查找:c语言
c语言·开发语言·算法
LYFlied20 小时前
【每日算法】LeetCode 64. 最小路径和(多维动态规划)
数据结构·算法·leetcode·动态规划
Salt_072820 小时前
DAY44 简单 CNN
python·深度学习·神经网络·算法·机器学习·计算机视觉·cnn
货拉拉技术20 小时前
AI拍货选车,开启拉货新体验
算法
MobotStone21 小时前
一夜蒸发1000亿美元后,Google用什么夺回AI王座
算法
Wang2012201321 小时前
RNN和LSTM对比
人工智能·算法·架构
xueyongfu21 小时前
从Diffusion到VLA pi0(π0)
人工智能·算法·stable diffusion
永远睡不够的入21 小时前
快排(非递归)和归并的实现
数据结构·算法·深度优先
cheems952721 小时前
二叉树深搜算法练习(一)
数据结构·算法
sin_hielo21 小时前
leetcode 3074
数据结构·算法·leetcode