欧拉角与万向节锁

原创 2018年04月17日 18:27:43

欧拉角与万向节锁之理论解析

  翻了一大堆博客,很少有对万向节锁介绍清楚的。这里谈谈我对万向节锁的通俗认识。

前提

  1. 我们这里采用左手坐标系(与Direct3D所使用的一样)。左手坐标系如下图:
    左手坐标系
  2. 我们使用的点用行向量来表示(与Direct3D所使用的一样),所以只能是vector*matrix,而不能是matrix*vector。
  3. 由于只考虑旋转,所以这里行向量是三维的,矩阵也是3x3的(在Direct3D中,由于要考虑平移,所以行向量是四维的,矩阵是4x4的)。

欧拉角的相关知识

  1. 所谓欧拉角就是绕x轴、y轴、z轴旋转的角度。(嗯,通俗易懂==)
  2. 由于绕轴的旋转顺序不同,得到的结果也不一定一样;
    比如我们把点(1,0,0)绕x、y、z轴顺序分别旋转pi/2、pi/2、0,得到的结果为(0,0,-1);
    如果我们把点(1,0,0)绕y、x、z轴顺序分别旋转pi/2、pi/2、0,得到的结果为(0,1,0);
    所以为了方便分析,我们这里以x、y、z的顺序来对点进行旋转

矩阵计算

  1. 前面我们旋转一个点是自己在脑子里想象着转的,如果使用矩阵计算的话该如何计算
      我们都知道可以使用旋转矩阵来计算,我这里把绕x、y、z分别旋转θ1、θ2、θ3的旋转矩阵贴在下面:
    xyz
      我们用Mat1、Mat2、Mat3来表示上面三个矩阵,用Pos来表示要旋转的点的坐标,最后旋转后的结果应该为Pos*Mat1*Mat2*Mat3。
  2. 矩阵计算所绕的轴是固定于世界的坐标轴还是物体自身的坐标轴
    • 可以用点(0,0,1)绕x、y、z轴顺序分别旋转pi/6、pi、0,来验证,使用上面介绍的矩阵计算得到的结果为(0,-0.5,-0.866),这跟使用固定于世界的坐标轴计算的结果是一致的。如果使用自身的坐标轴,结果应该为(0,0.5,-0.866)。所以这里使用的确实是固定于世界的坐标轴
    • 虽然是固定于世界的坐标轴,但是有一点要注意,就是后面的旋转轴不但会旋转前面得到的点坐标,同样也会旋转前面已经用过的旋转轴。所以严谨来说,应该是当前旋转矩阵使用的是固定于世界的坐标轴
  3. 矩阵计算与万向节的对应关系
    • Pos*Mat1*Mat2*Mat3是有层级关系的,Mat1(绕x轴)处于内层,Mat3(绕z轴)处于外层,外层会影响内层的结果;
    • 万向节也是相似的,内层的旋转轴对应于内层的旋转矩阵,外面的旋转轴对应外层的矩阵。外层的旋转轴会改变内层的旋转结果(这与矩阵运算也是一致的);这里给张万向节的图:
      万向节
    • 万向节的旋转结果与矩阵计算的结果是一样的,给定三个旋转角度,矩阵计算与旋转万向节可以得到一致的结果;
    • 万向节与矩阵计算的区别在于:矩阵计算只能是从左向右计算!这是由数学计算规则决定的(计算矩阵合并最后也还是要左乘)。而万向节可以在给定旋转角度的情况下,以任意次序旋转(当然,前提是万向节的层级关系必须和矩阵计算一致)。比如:可以先旋转外层再旋转内层,也可以先旋转内层再旋转外层(这与矩阵计算的次序一致)。

万向节锁产生的原因

  1. 对于矩阵运算Pos*Mat1*Mat2*Mat3,旋转角分别为θ1(绕x)、θ2(绕y)、θ3(绕z),我们可以合并右边的三个矩阵,假设Mat = Mat1*Mat2*Mat3,当θ2 = PI/2的时候,Mat的值为:
    这里写图片描述
    可以看到此时旋转矩阵只与θ1-θ3有关,也就是只能影响一个维度的旋转,也就是丢失了一个旋转自由度,这就是所谓的万向节锁。
  2. 对于万向节旋转来产生万向节锁更简单(因为不用推导==),只需要将处于中间层的旋转轴旋转PI/2,就能得到万向节锁,此时不论旋转内层旋转轴还是旋转外层旋转轴,都只能在同一个自由度上旋转。可以看这个视频来见识一下真正的万向节锁!

后记

有些博客说欧拉角是绕自身的x、y、z轴旋转的,我也不知道是怎么得出这个结论的==
这些都是我自己的理解,如有错误还请大家指正。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35817700/article/details/79978835

Unity视角旋转/摄像机围绕人物旋转

-
  • 1970年01月01日 08:00

【Unity编程】欧拉角与万向节死锁(图文版)

总结来说,欧拉角的“万向节死锁”问题,是由于欧拉旋转定义本身造成的。这种围绕选旋转前固定轴的先Z、再X、再Y的旋转操作,与其最终所预期的三个轴向可以旋转的结果并非一定是一对一的映射。某些情况下是多对一...
  • AndrewFan
  • AndrewFan
  • 2017-03-11 17:08:08
  • 8227

惯性导航之欧拉角与万向节死锁(三)

之前说过了,欧拉角有一些天生的缺陷,这里面最严重的就是”万向节死锁“,现在说一下什么是万向节死锁。工具: 三维笛卡尔直角坐标系 欧拉角 一、欧拉角定义中的限制前面已经说了,使用三个角度表示一个旋转就可...
  • ice__snow
  • ice__snow
  • 2015-10-05 22:04:06
  • 3890

欧拉角中的万向节死锁

为了便于理解我们举一个现实生活中的例子。 假如我们有一个望远镜和一个用来放望远镜的三脚架,(我们将)三脚架放在地面上,使支撑望远镜的三脚架的顶部是平行于地平面(参考平面)的,以便使得竖向的旋...
  • zhouyige1
  • zhouyige1
  • 2014-05-22 13:31:53
  • 1165

欧拉角万向节锁问题

这两天一直纠结在欧拉角的万向节锁问题上,查了很多资料,可是依旧没有完全弄懂这个问题,引用《3D数学基础:图形与游戏开发》一书中的一句话,”如果您从来没有遇到过万向锁情况,你可能会对此感到困惑,而且不幸...
  • HappyKocola
  • HappyKocola
  • 2017-05-28 01:38:54
  • 691

初识欧拉角与万向节死锁

介绍欧拉角,orientation的概念 unity中的rotation与euler angle的关系 万向节死锁的初步...
  • zgxmy
  • zgxmy
  • 2017-09-01 14:42:43
  • 757

万向节死锁(Gimbal Lock)欧拉角表示旋转的缺陷

万向节死锁(Gimbal Lock)欧拉角表示旋转的缺陷 假如我们有一个望远镜和一个用来放望远镜的三脚架,(我们将)三脚架放在地面上,使支撑望远镜的三脚架的顶部是平行于地平面(参考平面)...
  • immiao
  • immiao
  • 2015-09-21 11:36:04
  • 1935

欧拉角、四元数、万向节死锁现象

万向节死锁
  • dongdong0071
  • dongdong0071
  • 2016-03-24 17:10:07
  • 1487

unity 旋转欧拉角 万向锁 解释

万向锁 一直困惑我很久。。。。原因出在这里,我以为欧拉角旋转是以模型坐标(齐次坐标系)为旋转轴。问题就来了,无论旋转那个轴,其它两个轴也会相应的变化,下面看图:根据上面的说明两个旋转面(圆圈)怎么会共...
  • fengya1
  • fengya1
  • 2016-02-23 14:26:50
  • 10376

Unity编程 欧拉角与万向节死锁(图文版)

目录(?)[+]万向节死锁Gimbal Lock问题陀螺仪PitchYawRoll陀螺仪的工作原理陀螺仪中的万向节死锁用小程序来重现万向节死锁问题死锁的过程解析总结建议 万向节死锁(G...
  • a1256242238
  • a1256242238
  • 2017-06-14 19:36:46
  • 323
收藏助手
不良信息举报
您举报文章:欧拉角与万向节锁
举报原因:
原因补充:

(最多只允许输入30个字)