当前位置: 首页 > news >正文

计算机图形学:(四)欧拉角与四元数

# 导语

        在计算机图形学的学习中,几何变换(Transformations)是一块重要的内容,我们使用齐次坐标描述点和向量,使用变换矩阵描述平移、旋转等变换。而在平移、旋转、缩放这几种变换中,又以旋转的情况最为复杂。实际上,计算机图形学中三维空间的旋转不仅仅有旋转矩阵一种表达形式,欧拉角(Euler angles)四元数(Quaternions)也是常用的方法。

# 旋转矩阵

        这里再复习一下在计算机图形学:(一)基础中提到的旋转矩阵,假设绕XYZ三个轴旋转的角度分别为 α,β,γ ,则这三次旋转的旋转矩阵计算方法如下:

        最终的旋转矩阵为:

# 欧拉角

        旋转矩阵表面上看起来依赖于 9 个参数,实际上只有三个是独立的。为了更直接地指出这三个独立参数,欧拉(Euler)证明了如下事实:任何一个旋转都可以由连续施行的三次绕轴旋转来实现,这三次绕轴旋转的旋转角(α,β,γ )就是三个独立参数,称为欧拉角。

https://blog.51cto.com/u_12947/6481389

        欧拉角,这一数学概念,是描述物体在三维空间中绕坐标系三个轴(x, y, z轴)的旋转角度。它将方位(角位移)分解为绕这三个互相垂直轴的旋转,且这种分解具有任意性,即任意三个轴和旋转顺序都可以组成一个有效的欧拉角。

        🎈注:不同软件/引擎的默认坐标系不同,Heading(Yaw)通常指绕垂直轴的旋转(即取决于坐标系是Y-up还是Z-up)。如在Z-up系统中,heading-pitch-roll即为绕ZYX旋转;在GLM库中,eulerAngleYXZ()函数与yawPitchRoll()函数结果一致 [链接]。

偏航heading(蓝)--俯仰pitch(红)--滚转roll(绿)

        不同的旋转顺序会导致旋转结果不同,因此需要按照特定的旋转顺序进行欧拉角的计算和使用。在不考虑使用两种不同的约定来定义旋转(内旋或外旋,注:在后文再提及)的可能性下,存在12种可能得旋转轴序列,分为两组:

        (一)Proper Euler angles:也称为真欧拉角或者经典欧拉角。经典欧拉角中第一旋转轴和第三旋转轴是相同的,共有6种可能序列:

        (二)Tait–Bryan angles:也称为泰特-布莱恩角,万向角,航海角度,或者直接描述三个角(航向,海拔和高度或者偏航,俯仰和滚动) 。泰特-布莱恩角中三个角分别绕三个不同的轴转动,共有6种可能得序列:

        在实际使用中,为了简单起见,广泛采用“heading-pitch-roll”约定(注:heading有时也用yaw表示),它让物体从“标准”方位开始旋转,即物体坐标轴与惯性坐标系原点对齐。这种旋转顺序能通过依次作heading、pitch和roll旋转,使物体到达我们想要描述的方位。

        欧拉角可分为两种情况:①静态欧拉角(又称为外旋欧拉角)②动态欧拉角(又称为内旋欧拉角)

  • 静态欧拉角

        静态欧拉角是指物体绕世界坐标系三个轴的旋转,在这种情况下物体坐标轴保持静止。

        若按X-Y-Z旋转顺序(指先绕固定轴X,再绕固定轴Y,最后绕固定轴Z),可得旋转矩阵:

  • 动态欧拉角

        动态欧拉角则是指物体在自身坐标系中的旋转,这种旋转的复杂之处在于其坐标轴会随物体一起转动。

        若按Z-Y-X旋转顺序(指先绕自身轴Z,再绕自身轴Y,最后绕自身轴X),可得旋转矩阵:

        看到这里时泛起了迷糊,其他教程里以一句“外旋是左乘,内旋是右乘”草草带过,那么为什么是这样呢?

        这里来推导一下。首先,因为已经假设了物体自身轴对齐世界轴,所以绕物体X轴等价于绕世界的X旋转。若旋转顺序是XYZ,绕自身Y旋转的时候,已经存在X旋转了,已经被X轴的旋转影响到了。那么为了得到绕Y的旋转矩阵,我们先撤销绕自身X轴的旋转,进行Y旋转,再恢复X轴旋转。同理,为了得到绕Z的旋转矩阵,需要撤销Y轴旋转,再撤销X轴旋转,再进行Z轴旋转,再恢复X、Y轴旋转 [链接]。

        则内旋转最终表示为:

        那么若旋转顺序是ZYX,同理可得到:

        明白这点后,回到推导前,可以看到R_1=R_2。这个结论说明Z-Y-X顺序的内旋等价于X-Y-Z顺序的外旋任何的外旋都等于角度相同但元素旋转顺序相反的内旋,反之亦然

        用图片演示一下,最终下面两图表示了相同的旋转结果:

图1中表示的是使用zxz外旋转, (45°, 30°, -60°) 
图2中表示的是使用z-x'-z″内旋转, (−60°, 30°, 45°)

         内旋动画版(① 物体绕Z_{0}轴旋转 α 角度, 旋转后得到 X_{1}Y_{1}Z_{0}​;② 物体绕 X_{1}​ 轴旋转 β 角度,旋转后得到X_{1}Y_{2}Z_{2};③​ 物体绕 Z_{2}轴旋转 γ 角度,旋转后得到X_{3}Y_{3}Z_{2}):

# 万向节锁(Gimbal Lock)

        通过欧拉角我们可以直观地理解物体的旋转,但其缺点在于可能面临万向锁问题。我们使用平衡环来动态演示该问题:

        一开始承载物体的三个环互相垂直,构成直角坐标系,如将位于中间的红环旋转 90 度(顺/逆时针),就会发现最内侧的蓝环就会和最外侧的绿环环处于同一个平面上(即物体的两个旋转轴指向了同一个方向),导致整个系统丢失了一个“自由度”,也就是说现在内外侧的环对于物体施加的旋转效果是等效的。

        从代数意义来看,对于zyx轴顺序的旋转(内旋),按β=±90°,代入矩阵计算:

        那么对于任意沿zyx转 (γ,π/2,α) 的组合,都等价于 (0,π/2,γ−α) ,而前者有两个自由度( α 和 γ ),后者只有一个自由度( γ 与 α 的差值 γ−α ),这就是万向节锁的问题。

# 四元数

        四元数作为一种替代方案,更高效地描述了旋转,并避免了万向节锁问题。虽然 四元数的概念较为复杂,但它在计算机图形学中被广泛应用于物体的旋转。

        四元数是一种特殊的复数,通过结合旋转向量和旋转角度,提供了高效的旋转表示方法。其一般形式为q = xi + yj + zk + w,其中x、y、z代表向量的三维坐标,而w代表角度。四元数在描述物体旋转时只需关注这些关键值。

        未完待续....

http://www.xdnf.cn/news/659359.html

相关文章:

  • 尚硅谷redis7 37 redis持久化之AOF简介
  • Unity---OSC(Open Sound Control)、TouchOSC Editor、创建布局
  • Java高频面试之并发编程-21
  • Linux `hostname` 命令深度解析与高阶应用指南
  • Linux中的SELinux
  • RPM之(1)基础使用
  • 【2025】嵌入式软考中级部分试题
  • [特殊字符] useTranslations 客户端使用教程(Next.js + next-intl)
  • n8n中文版安装指南,使用Docker部署N8N中文版
  • 深度学习入门6:pytorch卷积神经网络CNN实现手写数字识别准确率99%
  • 深度学习中的卷积和反卷积
  • 北京大学肖臻老师《区块链技术与应用》公开课:01-课程简介
  • 《软件工程》第 11 章 - 结构化软件开发
  • Qt Creator快捷键合集
  • GESP2024年9月认证C++二级( 第三部分编程题(2)小杨的矩阵)
  • LangChain理解
  • Mybatis框架
  • Redis分布式缓存核心架构全解析:持久化、高可用与分片实战
  • UDP协议原理与Java编程实战:无连接通信的奥秘
  • 【Webtrees 手册】第 4 章 - 编辑指南
  • 通用的管理账号设置设计(一)
  • 02. [Python+Golang+PHP]三数之和,多种语言实现最优解demo
  • 华为OD机试真题——分糖果(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Linux 网络配置现代实践:Netplan 与 ifcfg 的全景对比与工程指南20250526
  • 身份证二要素核验:数字经济时代的信任基石
  • React从基础入门到高级实战:React 核心技术 - 表单处理与验证深度指南
  • 关于模型记忆力的实现方式
  • Linux GPIO子系统深度解析:从历史演进到实战应用
  • 使用 Pfam 和 InterProScan 进行蛋白质家族和功能域的分析
  • 第一章:MLOps/LLMOps 导论:原则、生命周期与挑战