惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
Attack and Defense Labs
Attack and Defense Labs
WordPress大学
WordPress大学
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Spread Privacy
Spread Privacy
AI
AI
宝玉的分享
宝玉的分享
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cyber Attacks, Cyber Crime and Cyber Security
爱范儿
爱范儿
Help Net Security
Help Net Security
V
Visual Studio Blog
大猫的无限游戏
大猫的无限游戏
Forbes - Security
Forbes - Security
P
Privacy & Cybersecurity Law Blog
Project Zero
Project Zero
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
T
Troy Hunt's Blog
美团技术团队
T
Threatpost
K
Kaspersky official blog
V
V2EX
Scott Helme
Scott Helme
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
V
Vulnerabilities – Threatpost
Last Week in AI
Last Week in AI
PCI Perspectives
PCI Perspectives
Google Online Security Blog
Google Online Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
I
InfoQ
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
L
LINUX DO - 最新话题
T
The Exploit Database - CXSecurity.com
L
LangChain Blog
S
Security @ Cisco Blogs
The Last Watchdog
The Last Watchdog
H
Hacker News: Front Page
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
TaoSecurity Blog
TaoSecurity Blog

博客园 - SoRoMan

Scene Management - Scene Graph 思考:矩阵的级联顺序与坐标系的关系 MFC的一些宏的整理 (DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE) 关于STL Improve Performance of C++ Codes (2) -- 如何消除临时对象? Improve Performance of C++ Codes (1) -- 使用初始化列表还是赋值语句? 思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,... 读书笔记:Writing Solid Code (4) 读书笔记:Writing Solid Code (3) 读书笔记:Writing Solid Code (2) 读书笔记:Writing Solid Code A 3D Real Time Fluid Solver Demo (三维实时流体解算器) 笔记:Delaunay三角剖分(Delaunay Triangulation)相关知识 学习经验:逐步建立学习资源列表-计算机图形学 SL专题6:谈谈Second Life中的游戏制作(Game Dev in SL) SL专题4:Second Life畅销商品 SL专题3:Second Life市场分析 SL专题2:加入并熟悉Second Life世界 SL专题1:Second Life(第二生命)--迟早火爆世界的游戏与Web的集大成者
关于万向节死锁(Gimbal Lock)(续)
SoRoMan · 2008-03-24 · via 博客园 - SoRoMan


以前发过一篇文章http://www.cnblogs.com/soroman/archive/2006/10/11/526163.html关于万向节死锁(Gimbal Lock)的,里面翻译了2维坐标系中的万向节死锁问题的阐述。后来,参考了各位bloger的观点以及一些资料,整理了一下3维下的Gimbal Lock问题,算是加深一下理解吧,如下:

在3维中常用的欧拉角坐标定向系统是用绕三个轴旋转的角度来表示物体的朝向(Rx,Ry,Rz)(注意三个轴是针对物体坐标系的)。如图1,物体处于世界坐标系(Xw,Yw,Zw)原点,此时物体坐标系(Xl,Yl,Zl)和世界坐标系重合(

这里我使用右手坐标系。你也可以使用左手坐标系,无所谓,一样)。此时,规定物体的朝向为(0,0,0)。


图1:物体的初始朝向

现在开始旋转物体,先绕物体坐标系x轴(Xl)旋转30度(这里我规定沿着轴向轴的负方向看去,顺时针旋转为正。你也可以自己规定,无所谓,遵守规定即可),注意,此时的物体坐标系已经发生变化,见图2,


图2:物体绕物体坐标系x轴(Xl)旋转30度

然后再绕Yl轴旋转90度,此时,你会发现Zl轴已经和了世界坐标系X轴共轴。见图3。

图3:物体绕物体坐标系y轴(Yl)旋转90度

好了,此时使用欧拉角来表示当前物体的方向的话,其坐标应该是(30,90,0),对应旋转顺序是Xl->Yl->Zl。然而,有意思的是如果再继续旋转,现在按照Zl旋转-40度,发现什么了?咦,怎么感觉已经绕过这个轴旋转过一次了,虽然轴向相反?^_^,anyway,最后的坐标应该是(30,90,-40),见图4。

图4:物体绕物体坐标系z轴(Zl)旋转-40度

好了,回到刚才的疑惑上,既然感觉两次旋转是绕同一轴,如果我一开始考虑全部绕该轴的旋转呢?即先绕Xl旋转30-(-40)=70度,然后再绕Yl旋转90度。^_^怎么样,已经到达和上次旋转的效果了吧。这说明什么?欧拉角坐标(30,90,-40)和(30-(-40),90,0)等同。甚至坐标(Rx1,90,Rz1)和(Rx2,90,Rz2)相同,只需满足Rx1-Rz1=Rx2-Rz2。当Rx1-Rz1=Rx2时,Rz2==0,即在这种情况下任何再绕Zl轴的旋转,都可以使用先绕Xl轴来做到。或者从另一个角度来说,物体现在本质上只能绕两个轴的旋转!即少了一个旋转自由度!这就是3维中的万向节死锁现象。

概括起来可以这么说,绕着物体坐标系中某一个轴,比如y轴的+(-)90度的某次旋转,使得这次旋转的前一次绕物体坐标系x轴的旋转和这次旋转的后一次绕物体坐标系z轴的旋转的两个旋转轴是一样(一样的意思是指在世界坐标系中,两次旋转轴是共轴的但方向相反),从而造成一个旋转自由度丢失。

实际上,使用3个量来表示3维空间的朝向的系统都会遭遇这个问题,除非用4个量来表示,如四元数。

2维的情况下欧拉角系统的万向节死锁导致了望远镜不能跟踪飞行器的位置,用某人的话就是在某种坐标系统下,空间中连续的的位置,不能用连续的坐标值来表示。看看3维情况下是不是也是这样?是不是不能跟踪飞行器的朝向?

举例:飞行器开始的方向是如图1所示,对应欧拉角坐标(0,0,0)。现在飞行器按照绕Xl 30度,然后绕Yl 40度,最后绕Zl 50度的顺序旋转,对应地,欧拉角坐标来跟踪的话是(30,40,50)。最后飞行器的朝向是如图5所示。

图5:坐标(30,40,50)对应的朝向

现在,飞行器又开始绕Xl轴转个1度。那么现在,欧拉坐标相应地变成(31,40,50)来跟踪,这个坐标对应的飞行器的朝向对吗?实际上是对的,没有问题,一切OK。

换个情况,飞行器从图1初始位置按照绕Xl 30度,然后绕Yl 90度,最后绕Zl -40度的顺序旋转,对应地,欧拉角坐标来跟踪的话是(30,90,-40),最后飞行器的朝向是如图4所示。现在,飞行器又开始绕Xl轴转个1度。那么现在,欧拉坐标相应地变成(31,90,-40)来跟踪,对吗?比划看看,使用这个坐标,飞行器肯定对不上了!万向节死锁还是那么讨厌。

这也是为什么3维的情况下,欧拉角插值不适合用来表示旋转插值(等角速度)的原因。使用四元数插值吧,可以参考:http://www.cnblogs.com/soroman/archive/2006/09/19/509597.html