万向节锁(Gimbal Lock)的理解】的更多相关文章

[TOC] 结论 我直接抛出结论: Gimbal Lock 产生的原因不是欧拉角也不是旋转顺序,而是我們的思维方式和程序的执行逻辑没有对应,也就是说是我们的观念导致这个情况的发生. 他人解释 首先我们看一下欧拉角的定义: 用一句话说,欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度. 在这里,坐标系可以是世界坐标系,也可以是物体坐标系,旋转顺序也是任意的,可以是xyz,xzy,yxz,zxy,yzx,zyx中的任何一种,甚至可以是xyx,xyy,xzz,zxz等等等等......所以说…
问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角度,所以很直接的就想到用欧拉角来表示每一个旋转.但是欧拉角会出现万向节锁,所以我使用四元数替代原来的欧拉角,来计算旋转矩阵.但是奇怪的结果出现了,gimbal lock仍然出现,使用四元数和使用欧拉角,程序的表现一模一样. 原因 经过一番思考,并参考 Using Quaternions for Op…
,如下图一,把灰色箭头想象成是一架飞机,红,绿蓝三个圈看作是三个外围控制器,外圈带动所有里圈运动,里圈的运动不影响外圈. 1,首先,绕Y轴旋转(旋转绿圈),来确定前进的方向.这时红圈与蓝圈都跟着旋转. 2,然后,绕x轴旋转(旋转红圈),让飞机仰视或俯视.这时蓝圈跟着一起旋转,绿圈不动. 3,最后,绕z轴旋转(旋转蓝圈),让飞机左右倾斜.这时只有蓝圈在转,红绿圈不动. 经过这三个步骤,我们可以把飞机调整到任意想要的角度.这也是FPS相机中常用的 yaw, pitch, row三个操作. 在步骤2中…
技术背景 在前面几篇跟SETTLE约束算法相关的文章(1, 2, 3)中,都涉及到了大量的向量旋转的问题--通过一个旋转矩阵,给定三个空间上的欧拉角\(\alpha, \beta, \gamma\),将指定的向量绕对应轴进行旋转操作.而本文主要就阐述这些旋转操作中,有可能面临到的一个重要问题--万向节死锁问题(Gimbal Lock). 一般大家觉得用图像化的方式来展示问题会显得更加的直观,但是这里我们准备直接用公式来陈述一下这个问题,也许会更直接.首先我们知道几个熟悉的旋转矩阵: \[R_Y(…
[Gimbal Lock] 万向锁源于欧拉角的是有序处理的.U3D中的序列为: y->x->z.当旋转y时,local坐标系与世界坐标系重合,所以y等于永远按惯性坐标旋转.当x旋转+/-90时,local z将与惯性 y重合. 这会导致两个问题: 1)不同的 y,x,z 序列可能得到相同的结果. 2)导致缺少一个自由度.原来通过local y可直接旋转到的角度,在缺少一个自由度的情况下,需要通过三个轴才通旋转过去,动画会形成畸形的轨迹.  在游戏中,当角色旋转的动画触发时,角色就会做一系列连续…
sql server锁(lock)知识及锁应用转自:http://blog.csdn.net/huwei2003/article/details/4047191 关键词:锁提示,锁应用 提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: ◆丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统…
volatile 特征: a:可见性:一个线程修改了某个共享变量的值,其他线程能够立马得知这个修改. b:禁止特定的处理器重排序. volatile的内存语义: 1.当写一个volatile变量的时候,jmm会把本地内存中的共享变量刷新到主内存. 2.当读一个volatile变量的是时候,jmm会把线程本地内存的值设置为无效,然后从主内存中读取共享变量. volatile的重排序有三个规则: 1.当第二个操作为volatile写的时候,第一个操作不管是什么,都不允许重排序. 2.当第一个操作为v…
一 Python GIL(Global Interpreter Lock) 全局解释器锁 如果一个主机是单核,此时同时启动10个线程,由于CPU执行了上下文的切换,让我们宏观上看上去它们是并行的,但实际上在微观上它们永远是串行的.如果一个主机有四核,代表它可以真真正正同时执行4个任务,而不是假象.但是在Python中,无论你有多少核,它永远都是假象,实际上它永远同一时间只能执行一个线程.这是Python在开发之初的一个设计缺陷.因为Python是1989年就诞生了,当时主机只有一个核,它的创始人…
一.介绍 首先, java 的锁分为两类: 第一类是 synchronized 同步关键字,这个关键字属于隐式的锁,是 jvm 层面实现,使用的时候看不见: 第二类是在 jdk5 后增加的 Lock 接口以及对应的各种实现类,这属于显式的锁,就是我们能在代码层面看到锁这个对象,而这些个对象的方法实现,大都是直接依赖 CPU 指令的,无关 jvm 的实现. 接下来就从 synchronized 和 Lock 两方面来讲. 二.synchronized 2.1 synchronized 的使用 如果…
一.公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解 公平锁:多个线程按照申请的顺序来获取锁. 非公平锁:多个线程获取锁的先后顺序与申请锁的顺序无关.[ReentrantLock 默认非公平.synchronized] 总结:非公平锁的吞吐量比公平锁大. 可重入锁(又名递归锁):线程可以进入任何一个它已经获取锁的同步代码块中. 可重入锁的最大作用:避免死锁 自旋转:是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁. 好处:减少线程上下文切换的消耗, 缺点:循环会消耗CPU…