万向节死锁 gimbal lock
,如下图一,把灰色箭头想象成是一架飞机,红,绿蓝三个圈看作是三个外围控制器,外圈带动所有里圈运动,里圈的运动不影响外圈。
1,首先,绕Y轴旋转(旋转绿圈),来确定前进的方向。这时红圈与蓝圈都跟着旋转。
2,然后,绕x轴旋转(旋转红圈),让飞机仰视或俯视。这时蓝圈跟着一起旋转,绿圈不动。
3,最后,绕z轴旋转(旋转蓝圈),让飞机左右倾斜。这时只有蓝圈在转,红绿圈不动。
经过这三个步骤,我们可以把飞机调整到任意想要的角度。这也是FPS相机中常用的 yaw, pitch, row三个操作。


在步骤2中,若旋转红圈过程中,恰巧旋转到了图二所示状态,然后进行步骤3时会发现,旋转蓝圈与绿圈效果一样。
也就是这种状态下,旋转Y或Z轴效果一样了,都只能使飞机左右倾斜,而不能再俯视或仰视(它只能头朝天),这下坏了,飞机操作失灵了,只能向上直冲。这就所谓的万向节死锁,gimbal lock.
可见,欧拉角旋转使用的是物体的局部坐标系,旋转过程是对局部坐标的三个轴X,Y,Z分别进行的旋转。
【所谓的死锁,仅是在一个操作单元,即XYZ组成的任意一个次序中出现了无法控制的现象,如上面飞机失灵的情况,我们可以继续操作X轴(红圈)来调整飞机的仰视和俯视,这时飞机又可以回到水平飞行的正常轨道上来了】
【但是,对于使用欧拉角旋转的程序,没有人会去专门写逻辑来判断是否发生了万向节死锁,D3D底层API更不会去管,因此我们的程序就会出BUG]
yaw 是左右看,pitch是俯视或仰视,roll就是左右倾斜。
如果我们写了一个FPS的飞机控制程序,当发生上面的死锁时,调用pitch就与调用roll一样了,当发现飞机朝上飞时,于是调用pitch想调整机头朝下,结果却发现飞机只是左右倾斜而机头仍然朝上直飞!出BUG了。
参考:http://www.cnitblog.com/luckydmz/archive/2010/09/07/68674.html
按上述方法在U3D编辑器中可以试验出万向节死锁,如下图,物体先绕X轴旋转90度后,再去调节Y轴和Z轴的旋转角时,发现物体只能绕Z轴旋转了,调节Y轴的旋转值时物体还是在绕Z轴转,死锁了。

欧拉旋转的计算可以有许多次序,上面的为YXZ次序,即先算绕Y的旋转,再算绕X的旋转,最后算绕Z轴的旋转。当然还可以有其它次序,如XYZ等。
死锁的的情况是与欧拉旋转的计算次序有关的。如YXZ次序时,只要绕X轴的旋转为90度,不管绕Y,Z旋转多少,都是死锁;XYZ次序时,只要绕Y的旋转为90度,不管绕X,Z的旋转是多少,都是死锁;其它类推,死锁取决于中间次序的那个轴。
如上面U3D中的试验,当我们先给rotation的Y设置90度,再调节X和Z的旋转值时,只要X不为90度就无死锁,这说明U3D在计算欧拉角时使用的计算顺序正是上面的YXZ顺序。
万向节死锁 gimbal lock的更多相关文章
- 使用四元数解决万向节锁(Gimbal Lock)问题
问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...
- 万向节锁(Gimbal Lock)的理解
[TOC] 结论 我直接抛出结论: Gimbal Lock 产生的原因不是欧拉角也不是旋转顺序,而是我們的思维方式和程序的执行逻辑没有对应,也就是说是我们的观念导致这个情况的发生. 他人解释 首先我们 ...
- Gimbal Lock欧拉角死锁问题
技术背景 在前面几篇跟SETTLE约束算法相关的文章(1, 2, 3)中,都涉及到了大量的向量旋转的问题--通过一个旋转矩阵,给定三个空间上的欧拉角\(\alpha, \beta, \gamma\), ...
- 【Unity编程】欧拉角与万向节死锁(图文版)
版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 万向节死锁(Gimbal Lock)问题 上文中曾经说过,欧拉旋转的顺规和轴向定义 ...
- Gimbal Lock
[Gimbal Lock] 万向锁源于欧拉角的是有序处理的.U3D中的序列为: y->x->z.当旋转y时,local坐标系与世界坐标系重合,所以y等于永远按惯性坐标旋转.当x旋转+/-9 ...
- java多线程(死锁,lock接口,等待唤醒机制)
一.Lock接口 常用方法 Lock提供了一个更加面对对象的锁,在该锁中提供了更多的操作锁的功能. 使用Lock接口,以及其中的lock()方法和unlock()方法替代同步,对电影院卖票案例中Tic ...
- 死锁、Lock锁、等待唤醒机制、线程组、线程池、定时器、单例设计模式_DAY24
1:线程(理解) (1)死锁 概念: 同步中,多个线程使用多把锁之间存在等待的现象. 原因分析: a.线程1将锁1锁住,线程2将锁2锁住,而线程1要继续执行锁2中的代码,线程2要继续执行锁1中的代码, ...
- 线程池,多线程,线程异步,同步和死锁,Lock接口
线程池 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源. 除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源.线程 ...
- 00103_死锁、Lock接口、等待唤醒机制
1.死锁 (1)同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步.这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁.这种情况能避免就避免掉: synch ...
随机推荐
- Android 优秀的开源框架整理
第一部分:系统架构 thinkAndroid https://github.com/white-cat/ThinkAndroid ThinkAndroid是一个免费的开源的.简易的.遵循Apache2 ...
- Spring(九)Spring对事务的支持
一.对事务的支持 事务:是一组原子操作的工作单元,要么全部成功,要么全部失败 Spring管理事务方式: JDBC编程事务管理:--可以控制到代码中的行 可以清楚的控制事务的边界,事务控制粒度化细(编 ...
- 朝花夕拾-android 从手机选择图片或拍照设置头像
Demo源码位置:http://git.oschina.net/zj2012zy/Android-Demo/tree/master/AndroidDemo/headset 一般需要用户信息的好多的也需 ...
- 高仿700Bike的界面图片
下面展示本人高仿项目"700Bike"的已经完成的界面:
- Xcode的内存清理
1.删除Xcode中多余的证书provisioning profile 手动删除: 打开finder,然后在最上面的前往中前往下方的路径,就可以看到你xcode运行到现在使用过的证书provision ...
- android基础开发之scrollview
scrollView 是android系统提供的一种 特殊的展示view. 其实我们很早就遇到过scrollview的东东,比如listview. 而google官方文档也提出,不要混合使用scrol ...
- Stack与Heap的区别
申明:这里所说的栈和堆是程序内存管理中的栈和堆,而不是数据结构里的栈和堆. (1)保存的内容不同:栈里保存的是局部变量,而堆里保存的是动态申请的变量. (2)栈里的内存系统自动申请和释放,程序执行出申 ...
- CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)
这篇文章主要介绍了CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)的方法,需要的朋友可以参考下 文章写的不错,很详细:IDO转载自网络: 准备篇: 1.配置防火墙,开启 ...
- [windows]利用IPSec对指定的ip进行访问限制
以win2003系统为例: 操作(看图): 1.任务:现在192.168.2.200可访问;目的;本地禁止对其访问 2.进入:管理工具->本地安全设置->IP安全策略 3.右键创建IP安全 ...
- Effective Java 64 Strive for failure atomicity
Principle Failure atomic - A failed method invocation should leave the object in the state that it w ...