欧拉角万向节锁问题

2023-10-27

欧拉角万向节锁问题

2017-05-28 01:38 465人阅读 评论(0) 收藏 举报
分类:

版权声明:本文为博主原创文章,未经博主允许不得转载。

这两天一直纠结在欧拉角的万向节锁问题上,查了很多资料,可是依旧没有完全弄懂这个问题,引用《3D数学基础:图形与游戏开发》一书中的一句话,”如果您从来没有遇到过万向锁情况,你可能会对此感到困惑,而且不幸的是,很难在本书中讲清楚这个问题,你需要亲身经历才能明白。”,认为这个确实需要在以后的实践过程中遇到这个问题时,才会理解地更加透彻.
虽然没有完全弄明白,但还是有一点总结:
(1)万向节锁问题,和具体的旋转顺序相关,例如最常用的ZXY顺序,在X轴旋转为+-90°时,无论Z轴和Y轴的旋转角度如何变化,物体将在某个维度上被锁住这篇文章中第二部分手机旋转的例子比较生动形象;如果此时X轴不是+-90°,那么在X轴不变的前提下,依旧可以通过选取适当的Z轴和Y轴旋转值使物体指向三维空间中的任意方向.
(2)(1)中的锁住并不是很多文章中所说的物体无法通过旋转改变方向了,而是若要改变成某个方向,那么yaw-pitch-roll的角度会发生”突变”,如何理解这种突变呢?借助一个例子来,该例子来源于这篇文章,对于一个炮塔模型,假设地面上的一个炮塔有两个旋转轴:Y(对应于yaw)垂直于地面,使炮塔可以平行地面360°旋转(12点方向为0°);X(对应于pitch)平行于地面,使得炮口可以绕着它上下90°旋转(平行地面设为0°),这里我们省略roll旋转角,因为roll是对炮口本身进行旋转(炮口本身的旋转对于这里的例子没有太大意义,为了简单,故省略),这里的X和Y已经足够表示天空中的任意一点!
这时,一架敌机从3点钟方向飞来,其在炮台坐标系的坐标是XY-(10,-90),Y=-90°的原因是炮口初始对准的是12点方向,需要顺时针旋转90°(以逆时针为正)指向三点方向.飞机保持9点钟的方向飞行,随着飞机逐步向炮台正上方飞来,X不断增大,当飞机恰好飞到炮塔顶端时,即X=90°时(XY-(90,-90)),飞机突然向6点钟方向飞行,且假设其飞至XY-(89, -180),我们发现,简单地转动X轴或者Y轴都无法使得炮口由正上方(89,-90)转到飞机所在的方向,只有先将Y轴顺时针转动90°,再将X轴逆时针转动1°,才能重新指向飞机的位置,我们发现,炮口相比于之前(10,-90)->(90,-90)的方向连续变化,现在却发生了“突变”.那么这种突变的影响是,在飞机由(90,-90)->(89,-180)时,飞机是直线飞行,若炮口继续保持匀速转动,炮口方向在由(90,-90)->(89,-180)时,其过程可能是这样的(90,-90)->(89.8,-108)->(89.6,-126)->(89.4, -144)->(89.2, -162)->(89, -180),如果在坐标系中画出这些点并连接起来,就会发现其近似一根弧线,这样,飞机是直线飞行,但炮口在这段时间内是曲线运动,结果就是这段时候内炮口会丢失目标!上述这个过程在做插值动画时尤为明显(插值过程就是上述的坐标变化过程),而万向节锁的真正问题也在于此!并不是上述链接中说的,炮口方向无法变化.
(3)虽然可以通过修改旋转顺序来改善万向节锁问题(例如Unity里采用的ZXY顺序,就可以确保Y在0~360角度旋转时都不会发生这个问题),但治标不治本,修改旋转顺序只能在某个旋转角上避免出现万向节锁,可是其它角度依旧会有问题;实际上,”任何使用三个数来表达3D方位的系统,若能保证空间的唯一性,就都会遇到这个问题”.解决的办法是,采用四元数,具体课搜索其它博客了解,在这多说一句,四元数理解起来相对欧拉角比较困难,但可以有效解决万向节锁的问题;
(4)欧拉角出现万向节锁的另一个原因是,别名!例如(2)中的炮台,(90,-90)和(90,-180)实际上都是炮口竖直朝上,因此也导致了旋转路径发生偏移!
(5)万向节死锁会导致位置上连续变化 在数值表示上确是非连续的,给定的两个关键帧之间无法平滑过渡.

实际上,自己对于万向节锁以及相关的问题还存在很多困惑,
(1)这篇文章中的数学证明过程无法理解,感觉作者的证明过程有点以结果来证明结果,特别是”Rb = Rr~*Ry*Rr 要得到绕 坐标系E在绕z轴旋转r后的新系E’下的y轴旋转β的旋转矩阵为Rb,可以先应用Rr~这时可以视作在E下,然后使用E下的旋转Ry绕旧的y轴旋转,在应用Rr转回到E’”这一段,完全不知所云!
(2)这篇文章里提及的静态欧拉角和动态欧拉角;
(3)我在草稿上演示旋转过程时,发现对于给定的角度(x1, y1,z1),分别绕X,Y,Z轴以一定的顺序对指定的点或者线段进行旋转时,最终的结果都是(2)中静态欧拉角的结果,但看到的书籍和博客关于这个都是指动态欧拉角的结果,疑惑不解!
(4)物体坐标系和世界坐标系的轴发生重合,为何会导致万向节锁问题?

这些问题困扰了很久,这两天一直在查资料,画图验证,演算,依旧没有完全弄明白,而且弄得心神疲惫,在此做记录,希望以后实践经历丰富后,再逐步解决这些问题!

解决该问题过程中一些不错的博客:
1.Unity 中的旋转
2.【Unity技巧】四元数(Quaternion)和旋转
3.游戏动画中欧拉角与万向锁的理解
4.欧拉角与万向节死锁
5.万向节死锁问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

欧拉角万向节锁问题 的相关文章

  • Spring源码深度解析:九、bean的获取③ - createBeanInstance

    一 前言 文章目录 Spring源码深度解析 文章目录 createBeanInstance 的流程图如下 让我们根据流程图一步一步的学习一下spring是如何创建bean的吧 这篇文章是接着 Spring源码深度解析 八 bean的获取
  • 基于TensorFlow的CNN卷积网络模型花卉分类(1)

    一 项目描述 使用TensorFlow进行卷积神经网络实现花卉分类的项目 加载十种花分类 建立模型后进行预测分类图片 环境 win10 TensorFlow gpu 1 12 0 pycharm 训练集 训练数据存放路径为 D LearnM
  • 用bat批量重命名不同文件夹下的同名文件

    起因 手机B站离线的视频目录是这个样子的 视频的每一个分P都会生成一个文件夹 包含视频基本资料和一个名为80的文件夹 这个文件夹里放着后缀名为m4s的音频和视频文件 现需要使用电脑播放下载的视频 那么第一步就是更改视频和音频文件的后缀名 百
  • 防火墙总结

    一 什么是防火墙 防火墙分为软件防火墙和硬件防火墙 他们的优缺点 硬件防火墙 拥有经过特别设计的硬件及芯片 性能高 成本高 当然硬件防火墙也是有软件的 只不过有部分功能由硬件实现 所以硬件防火墙其实是硬件 软件的方式 软件防火墙 应用软件处
  • Failed to load module “canberra-gtk-module“ 或 Using GTK+ 2.x and GTK+ 3 in the same process is not

    项目场景 ubuntu安装matlab之后 运行时报错Failed to load module canberra gtk module 如下 原因分析 未安装Matlab运行所需要的依赖 执行如下命令 sudo apt get insta
  • 深入浅出UML类图(二)

    类与类之间的关系 1 在软件系统中 类并不是孤立存在的 类与类之间存在各种关系 对于不同类型的关系 UML提供了不同的表示方式 1 关联关系 关联 Association 关系是类与类之间最常用的一种关系 它是一种结构化关系 用于表示一类对

随机推荐

  • 树的四种遍历C/C++实现

    树的四种遍历C C 实现 树的四种遍历C C 实现 结构定义 先序创建树 先序遍历 中序遍历 后序遍历 层次遍历 总代码 给懒人下载运行用 运行示例 树的四种遍历C C 实现 备考期末 懂得都懂 手敲遍代码 比较懒 都是递归形式 结构定义
  • error LNK2019: 无法解析的外部符号 WSAStartup,该符号在函数 “public:

    error LNK2019 无法解析的外部符号 gethostname 该符号在函数 public static bool cdecl gdcm System GetHostName char const GetHostName Syste
  • Fragment 实现简易新闻界面(适配手机与Pad)

    一 前言 Android 在 Android 3 0 API 级别 11 中引入了 Fragment 主要目的是为大屏幕 如平板电脑 上更加动态和灵活的界面设计提供支持 由于平板电脑的屏幕尺寸远胜于手机屏幕尺寸 因而有更多空间可供组合和交换
  • 前端白屏检测方案

    早期因为浏览器 技术 兼容性等诸多问题 导致网页的显示效果非常的单一 基本都是静态页 后续随着Angular React Vue等前端框架的出现 采用SPA单页面应用的方案越来越多 用户和企业对于页面的稳定性 性能有了更高的诉求 根据Abe
  • 为什么我们的自动化测试“要”这么难

    为什么我们的自动化测试 要 这么难 笔者在别的贴子里面曾提过 自己所在部门的 自动化测试经历了几次步进式的建设 都具有阶段性的成果 但是总的看来却不是一个成功的案例 因为赶进度 仓促的投入让一大堆的脚本质量比较低下 有几个测试组由于没有人力
  • Selenium

    Selenium 参考崔庆才爬虫 安装 pip install selenium 注意 需要下载Chrome的 webdriverwebdriver 下载完成后解压到与python exe可执行文件同一目录下 基本使用 from selen
  • this.getClass().getClassLoader().getResourceAsStream找不到文件

    this getClass getClassLoader getResourceAsStream 路径正确 但是找不到文件时 要检查对应xml文件是否放到了这个地方 只有放到了才能找到
  • 安卓手机GPU OpenCL总结

    前段时间 把市面上手机GPU OpenCL支持情况做了一个总结 总结如下 目前 手机 GPU 市面有四个公司产品 Qualcomm Imagination Technologies ARM Vivante 分别对应的产品如下 所有表格均是按
  • Springboot课程试题库管理系统毕业设计源码271129

    Springboot 计算机网络原理 课程试题库管理系统 摘 要 信息化社会内需要与之针对性的信息获取途径 但是途径的扩展基本上为人们所努力的方向 由于站在的角度存在偏差 人们经常能够获得不同类型信息 这也是技术最为难以攻克的课题 针对 计
  • 录制、回放乱码问题解决办法和快照问题解决办法.

    1 录制的脚本乱码 LR录制的脚本中可能会有乱码 主要是当URL中有中文时 通过如下问题可以解决此问题 a Go to Vugen gt Tools gt Recording Options gt Advanced b Check the
  • 失业的程序员(六):加班

    本系列前章 失业的程序员 一 二 三 四 五 一 本文前戏 谈爱 每次开文我总要说一些看起来和本文其实关系不大的啰嗦话 也希望各位观众能够习惯 稍微花费大家几分钟时间便可进入正文 再一次跪求谅解 前几天在家看 我是歌手 复活赛那期 着实震撼
  • 1.开始学习前端(HTML+CSS+JavaScript)学习记录

    1 了解前端 Web开发 对于网页开发 最基础的 最核心的技术就是html css javascript 简称js 这三个技术也被称为前端开发 新三剑客 在Web1 0时代的 网页制作 网页三剑客是指网站的开发工具 Dreamweaver
  • 2009年8月21日

    开通博客了 new Start 1 加了的Active控件Windows Media Player如何能使用快进FastForward 和快退FastForward 这两个功能呢 给控件关联一个control变量 然后调用FastForwa
  • 大数据分析陷阱与Simpson’s Paradox(辛普森悖论)

    在大数据分析时 你有没有遇到这样一种奇怪现象 当分开看数据的时候会得到一种结论 但是合起来之后发现情况却完全改变 这就是著名的辛普森悖论 它总是隐藏在大数据之中 成为大数据分析的陷阱之一 1 含义 辛普森悖论 Simpson s Parad
  • 用C语言进行面向对象编程

    在C语言中进行面向对象编程需要使用一些特定的技术和方法 具体如下 结构体 在C语言中 结构体可以用来表示一个对象的属性和状态 相当于一个类的实例变量 结构体中可以包含不同类型的数据成员 如整数 字符 指针等 函数指针 C语言中可以使用函数指
  • 全局配置Element UI 中的 $message 的显示时长

    首先说下我是全局引入的Element UI组件 这是要更改message 的默认的时长 重写message的方法 import ElementUI from element ui import element ui lib theme ch
  • 修改 el-dialog__body padding

    在dialog外部套个div 再写deep addDia deep el dialog body padding bottom 0
  • angular 路由

    参考 angular 路由 文档 路由案例 路由参数 paramMap和Snapshot 当组件需要复用的时候使用paramMap获取路由参数 如一个组件不刷新 只更改了路由参数 那么就可以实时获取路由参数 当确定组件不复用的时候直接使用S
  • Python turtle画图库&&画姓名

    看一下我定义的change 和run 函数 绘图坐标体系 作用 设置主窗体的大小和位置 turtle setup width height startx starty width 窗口宽度 若值是整数 表示像素值 若是小数 表示窗口宽度与屏
  • 欧拉角万向节锁问题

    欧拉角万向节锁问题 2017 05 28 01 38 465人阅读 评论 0 收藏 举报 分类 计算机图形学 5 版权声明 本文为博主原创文章 未经博主允许不得转载 这两天一直纠结在欧拉角的万向节锁问题上 查了很多资料 可是依旧没有完全弄懂