Gimbal Lock

Gimbal Lock的原理网上已经有很多资料,详细可以看介绍视频。视频讲到Gimbal Lock的时候提到x,y,z三个坐标轴是有从属关系(hierarchical system)的,也就是说对于如图所示的系统,绕y轴旋转的时候x,z轴都会随着改变;绕x旋转的时候z轴会改变;绕z旋转的时候y,x都不会变,正是因为这样,所以当物体绕x旋转90°时y轴与z轴会处在同一平面,此时DoF就会减少1,导致了Gimbal Lock的现象。

Unity中物体旋转方式

首先我们以Unity3D来看看物体在其中是如何旋转的,这篇文章中提到

Editor中Transform组件的旋转轴是父节点的模型空间坐标轴,如果没有父节点,则旋转轴是世界空间坐标轴

脚本中用Rotate函数在Space.World中进行旋转,旋转轴就是世界坐标系的坐标轴

脚本中用Rotate函数在Space.Self中进行旋转,旋转轴就是局部坐标系的坐标轴

并且在文章中还做了实验:

1. 静态欧拉角

这种情况对应着上面所述的使用Space.World进行旋转,以及Inspector中的旋转。即使旋转轴在旋转的过程中保持不变,旋转的顺序会决定最后的旋转结果。我们看下面的例子会很清晰的理解:

  • 情形一:首先绕世界坐标系的x轴旋转90度,再绕世界坐标系的y轴旋转90度

  • 情形二:首先绕世界坐标系的y轴旋转90度,再绕世界坐标系的x轴旋转90度

可以看到,由于旋转顺序的不同,最终导致了旋转结果的不同!(究其本质,是因为矩阵乘法不满足交换律)

Inspector中的rotation值

上述文章中提到的现象应该是针对的是脚本的情况,因为在Inspector测试中发现不论第一种情形还是第二种情形旋转的结果是一样的。之后我针对inspector中Transform控件的rotation值进行了一些测试,来探究该值究竟是如何影响物体旋转的,在测试后得出了结论:假设物体初始状态(没有任何旋转)是A,将rotation的值变为(x1,y1,z1)后得到的状态是B,此时B的位置是是按照z-x-y的顺序(Unity文档中提到的顺规)将物体从初始状态A(即rotation设置为0,0,0)依次绕自身z轴,y轴,x轴旋转z1,y1,x1角度得到的。若此时再将rotation的值变为(x1,y1,z2),称为状态C,那么实际上物体发生的变化不是在B的基础上绕z轴旋转z2-z1角度,而是重新在A状态的基础上重新计算了旋转角(x1,y1,z2),得到状态C。再将物体从现状态B变换过去,所以我们观察到的现象是物体不一定是按照局部坐标系或者世界坐标系旋转的。

Inspector旋转中的万向节死锁

在得到了上述结论之后我们就能对在inspector旋转出现的Gimbal Lock现象做出解释了。我们先将rotation中x的值改为90°,然后再改变y的值与z的值,会发现改变这两个值物体都是在同一个方向上进行旋转的,这种现象就是我们遇到的Gimbal Lock。原因就是实际上在每一次有新的rotation值的时候Unity都重新进行了一次计算,旋转角度为(90°,y1°,z1°)时,进行的过程是先将物体绕z轴旋转z1°,再绕x轴旋转90°,此时z轴转到了现在世界坐标系y轴的位置上,意思就是说接下来在y轴旋转y1°的操作与原来绕z轴旋转z1°实际上是在同一个方向,这就是在世界坐标系下旋转(静态欧拉角)的Gimbal Lock现象。对于局部坐标系下旋转(动态欧拉角)的情况之前的参考文章也有提到,其与世界坐标系不同的是物体以当前旋转的坐标作为状态A再进行操作,其他过程与上述情况类似,产生Gimbal Lock的情况也是类似的。

                                                            

图1:初始位置                               图2:绕x轴旋转90°后z轴所在的位置与世界坐标系下z轴位置重合

总结一下,视频中提到的从属关系实际上说的是三维旋转的顺规问题,也正是由于这种机制,物体在某个旋转方向上会失去一个DoF(Degree of Freedom),这种现象就是Gimbal Lock,解决方法就是采用四元数旋转。

Unity中旋转方式的探究与对万向节死锁(Gimbal Lock)的理解相关推荐

  1. 如何快速解决Unity中万向节死锁(gimbal lock)的问题

    如何快速解决Unity中万向节死锁(gimbal lock)的问题 转载连接:https://www.jianshu.com/p/59acdd1c9db8 万向节死锁的根本问题是欧拉角(EulerAn ...

  2. 欧拉角表示旋转会出现的问题——万向锁(Gimbal Lock)

    本文用来总结万向锁问题.尽量写得非常简单,方便自己复习和后人理解,水平有限若有错误请指教. 一.旋转的表示 本文中矩阵计算的结果是在世界坐标系(称之为North East Down Frame NED ...

  3. 【Unity学习笔记】Unity中的欧拉角(Euler Angle)和万向节(Gimbal)

    声明:此篇文章是个人学习笔记,并非教程,所以内容可能不够严谨.可作参考,但不保证绝对正确.如果你发现我的文章有什么错误,非常欢迎指正,谢谢哦. 目录 1 奇怪的现象 1.2现象一 1.2 现象二 1. ...

  4. 【Unity编程】Unity中的欧拉旋转

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自 ...

  5. Unity中行星和恒星的旋转——Rotate和RotateAround

    Unity中的旋转--以行星环绕为例 实现效果 一.与之相关的两种旋转方式 1.Rotate 2.transform.RotateAround 二.行星案例的实现 Step1:我们先在场景中创建一个球 ...

  6. 探究PBR的两种流程以及Unity中的PBS

    原文链接 前言 通过上一篇博客PBR原理我们大概了解了PBR的一些基础理念,这篇博客就让我们来探究一下PBR的两种流程和Unity中两种PBS材质,毕竟Unity是我主要学习的引擎(希望未来有机会接触 ...

  7. Unity中传入任意数,转换成分,秒,并进行倒计时换算..(两种方式)

    第一种方式是利用Unity中的协程,代码如下: using System.Collections; using System.Collections.Generic; using UnityEngin ...

  8. unity中脚本之间传递信息的方式

    //unity菜鸡,将自己学习中的知识写下来.如若发现错误,希望可以私信.共同进步 在unity中,脚本之间传递信息有几种方式 第一种也是比较正统的吧,SendMessage函数,他有如下这几种形式: ...

  9. Unity使用c#开发遇上的问题(六)(3dmax围绕指定中心旋转,unity中动态调用预制体并根据模型旋转指定角度)

    文章目录 前言 一.3dmax创建子弹.炮塔及武器库 1.相关模型 2.炮塔模型引入unity,无法绕旋转球旋转,重新调整 1.3dmax中默认炮管的中心点 2.选择层次界面 3.选择编辑工作轴 4. ...

最新文章

  1. LSTM之父:吐槽了两年,来划划重点:“这5篇最高引论文都源于我们。”
  2. 吴恩达新书《Machine Learning Yearning》中7个实用建议(附论文)
  3. python【力扣LeetCode算法题库】面试题59 - II- 队列的最大值
  4. android listview 自动循环滚动条,ListView的自动循环滚动显示【原创】
  5. Java 线程池框架核心代码分析
  6. 第一类第二类丢失更新
  7. 构架https服务器
  8. 弦图与完美消除序列(bzoj 1006: [HNOI2008]神奇的国度)
  9. 供销大集有潜力吗_社区团购遭点名批评,互联网巨头真的只是惦记那几捆白菜吗?| 吴坚浙商频道...
  10. 全能文件恢复软件推荐
  11. MCU升级文件HEX、BIN、S19格式概述
  12. 台式机U盘安装Centos 安装界面黑屏并且没有网卡驱动
  13. linux4 系统下载,syslinux下载|
  14. 20221024 matlab快速画图中图
  15. illegal offset type php,PHP warning Illegal offset type错误解决办法
  16. 微信小程序开发后台篇(四)AWS EC2实例云部署---Windows环境通过PuTTY连接EC2实例
  17. Google Earth Engine(gee)中的Geometry
  18. 关于网络制式(例如:TD-SCDMA /GSM)
  19. 惠普电脑如何重装Linux系统,如何把惠普下的Linux操作系统换为windows 7
  20. vscode之plantUML流程图

热门文章

  1. .icns 是什么 又是如何创建的?
  2. ssh汉字乱码怎么办_ssh中文乱码怎么办_win10open ssh出现乱码的解决方法
  3. Linux 命令 快捷键
  4. MySQl之最全且必会的sql语句
  5. EnCodePro 文件加密大师 使用指南(帮助文档)
  6. IE11打开网页会有彩色方块出现
  7. 盲打助手(Touch-Typing) 1.0 正式版 (下载)
  8. discuz论坛数据表中文对照表
  9. 搭建自己的YOLOv5目标检测平台出现的问题
  10. css碎步测量,测量学教学实习报告、测量学教学实习报告内容.docx