文章目录

  • 欧拉角(Euler)
    • 万向节
    • 欧拉角旋转特性
    • 欧拉角优点
    • 欧拉角缺点
      • 方位的表达方式不唯一
      • 万向节锁(Gimbal Lock)
  • 四元数(Quaternion)
    • 四元数转轴角
    • 四元数优点
    • 四元数缺点
    • Quaternion类

欧拉角(Euler)

什么是欧拉角?百科上是这样解释的:用来确定定点转动刚体位置的3个一组独立角参量,由章动角θ、旋进角(即进动角)ψ和自转角φ组成,为欧拉首先提出而得名。

很难理解吧?其实我们没有必要把欧拉角想得太复杂。

对于开发者来说,欧拉角就是用一个Vector3变量来记录物体沿着x、y、z轴的旋转。注意,虽然这是一个Vector3变量,但它并不是向量,这个变量的x、y、z三个分量是用来描述旋转的。

欧拉角特点:

  • 使用3个角度来保存方位。
  • x 与 z沿自身坐标旋转,y 沿世界坐标旋转。
  • API:Vector3 eulerAngle = this.transform.eulerAngles;

万向节

万向节,也叫平衡环架(Gimbal),具有枢纽的装置,使得一物体能以单一轴旋转。由彼此垂直的枢纽轴所组成的一组三只平衡环架,则可使架在最内的环架的物体维持旋转轴不变。常常应用于船上的陀螺仪、罗盘、饮料杯架等。

在飞行器的航行中,进行XYZ三个方向旋转的旋转有专业的术语,见下图:

沿着机身右方轴(Unity中的+X)进行旋转,称为pitch,中文叫俯仰。
沿着机头上方轴(Unity中的+Y)进行旋转,称为Yaw,中文叫偏航。
沿着机头前方轴(Unity中的+Z)进行旋转,称为Roll,中文叫桶滚。

欧拉角旋转特性

欧拉角的旋转就是沿着万向节的轴旋转的。目前人类最常用也最容易理解的方式是先沿着X轴旋转,再沿着Y轴旋转,最后沿着Z轴旋转,最后达到目标旋转角度。如下图所示:

这时候可能就有人会有疑问了,为什么不能三个轴同时旋转呢?
实际上,如果三个轴同时旋转,将会无法达到你预期的旋转效果。为什么呢?因为物体是一个整体,当某一个轴进行旋转时,其他的轴是跟着物体一起动的,如果还是按照原来的旋转角度旋转则会随着其他轴的转动形成偏移,如下图所示:

我们想要的其实只是让箭头指向我们,但三个轴同时旋转却使这个旋转轨迹划出了一个不应该有的弧线。

所以我们要了解的是,欧拉旋转是一定要有顺序的。这样的问题其实是无法避免的,但是我们可以根据物体的旋转情况对此进行优化,这个优化的方法就是给三个轴指定一个新的层级顺序。

当然这并不是真正的解决了问题,只是尽量避免了问题而已。欧拉角的问题是无法彻底解决的,

欧拉角优点

  • 仅使用三个数字表达方位,占用空间小。
  • 沿坐标轴旋转的单位为角度,符合人类思考方式。
  • 任意三个数字都是合法的,不存在不合法的欧拉角。

欧拉角缺点

方位的表达方式不唯一

对于一个方位,存在多个欧拉角描述,因此无法判断多个欧拉角代表的唯一是否相同。

例如:

  • 角度 0, 5, 0 与角度 0, 365, 0
  • 角度 0, -5, 0 与角度 0, 355, 0
  • 角度 250, 0, 0 与角度 290, 180, 180

为了保证任意方位都只有独一无二的表示,Unity引擎限制了角度范围,即沿x轴旋转限制在 -90 ~ 90 之间,沿 y 与 z 轴旋转限制在 0 ~ 360 之间。

万向节锁(Gimbal Lock)

当物体沿 x 轴旋转 ±90°\ \plusmn 90° ±90° ,自身坐标系z轴与世界坐标系y轴将重合,此时再沿y轴或z轴旋转时,将会失去一个自由度。

Unity的优化方案:在万向节死锁的情况下,规定沿z轴完成绕竖直轴的全部旋转,即此时y轴旋转为0。

关于万向节锁的讲解视频:https://v.youku.com/v_show/id_XNjk1MTkzMTM2.html#paction

在使用欧拉旋转的情况下,万向节锁的情况是无法避免的,为了更好的表示旋转,Unity引入了四元数的概念。

四元数(Quaternion)

四元数在3D图形学中代表旋转,由一个三维向量 /[x,y,z]/ [x, y, z]/[x,y,z] 和一个标量 /w/ w/w 组成。

旋转轴为 VVV ,旋转弧度为 θ\thetaθ ,若使用四元数表示,则四个分量为:
x=Sin(θ/2)∗V.xy=Sin(θ/2)∗V.yz=Sin(θ/2)∗V.zw=Cos(θ/2)x = Sin(\theta / 2) * V.x \\ y = Sin(\theta / 2) * V.y \\ z = Sin(\theta / 2) * V.z \\ w = Cos(\theta / 2)x=Sin(θ/2)∗V.xy=Sin(θ/2)∗V.yz=Sin(θ/2)∗V.zw=Cos(θ/2)
四个分量的值都在 -1 到 1 之间。

几何应用:四元数与向量相乘,可以实现向量的旋转。

代码:

// 获取四元数
Quaternion qt = this.transform.rotation;// 使用四元数做旋转
this.transform.rotation = Quaternion.Euler(0, 50, 0);// 或者调用Rotation方法实现旋转
this.transform.Rotation(0, 50, 0);

四元数旋转角度相加需要用 * 乘法,而不是加法。

四元数转轴角

Transform 中的 rotation 使用的是四元数,有时我们需要获取 Transform 沿某一个轴旋转的角度,此时可以用下面的代码进行计算:


Quaternion q = transform.rotation;// 计算X轴旋转角度
float angleX = 0;
float siny_cosp1 = 2 * (q.w * q.x + q.z * q.y);
float cosy_cosp1 = 1 - 2 * (q.y * q.y + q.x * q.x);
float radian1 = Mathf.Atan2(siny_cosp1, cosy_cosp1); // 求出弧度
angleX = radian1 * Mathf.Rad2Deg; // 转化角度
Debug.Log("=============" + angleX);// 计算Z轴旋转角度
float angleZ = 0;
float siny_cosp2 = 2 * (q.w * q.z + q.x * q.y);
float  cosy_cosp2 = 1 -2 * (q.y * q.y + q.z * q.z);
float radian2 = Mathf.Atan2(siny_cosp2, cosy_cosp2); // 求出弧度
angleZ = radian2 * Mathf.Rad2Deg; // 转化角度
Debug.Log("=============" + angleZ);

上述方法适用于物体只在一个轴上做了旋转的情况,Y轴的计算方法以此类推。

四元数优点

避免万向节死锁,完全沿自身轴(而不是全局轴)旋转。

四元数缺点

难于使用,且存在不合法的数值。

Quaternion类

Unity中提供了Quaternion类来处理四元数相关操作,该类的使用方法可以参考我的另外一篇文章:【Unity】Unity常用类:向量Vector3、四元数Quaternion


本文万向节部分内容参考了塞北烟云大神的文章,地址如下:https://www.jianshu.com/p/9f45e91a2391

更多内容请查看总目录【Unity】Unity学习笔记目录整理

【Unity】Unity 欧拉角、四元数、万向节死锁、四元数转轴角相关推荐

  1. Unity编程 欧拉角与万向节死锁(图文版)

    万向节死锁(Gimbal Lock)问题 上文中曾经说过,欧拉旋转的顺规和轴向定义,自然造就了"万向节死锁"问题.本文主要来探索它自然形成的原因. 陀螺仪 首先,我们来了解Gimb ...

  2. 【基础】Unity:欧拉角与万向节死锁(图文版)

    转自:http://blog.csdn.net/andrewfan/article/details/60981437 万向节死锁(Gimbal Lock)问题 上文中曾经说过,欧拉旋转的顺规和轴向定义 ...

  3. 如何脱离数学推导理解欧拉角与万向节死锁

    如何脱离数学推导理解欧拉角与万向节死锁 目录 如何脱离数学推导理解欧拉角与万向节死锁 0.需要提前掌握的知识 1.死锁的本质-旋转面重合的成因 2.死锁出现将导致什么?-失控 3.旋转面逐渐慢慢走向重 ...

  4. 欧拉角与万向节死锁(图文版)

    万向节死锁(Gimbal Lock)问题 上文中曾经说过,欧拉旋转的顺规和轴向定义,自然造就了"万向节死锁"问题.本文主要来探索它自然形成的原因. 陀螺仪 首先,我们来了解Gimb ...

  5. 欧拉角死锁_欧拉角与万向节死锁

    欧拉角万向节死锁的问题困扰了自己很久,一直跟飞机结合不起来.昨天看代码,遇到用飞机三个姿态角度构造四元数的问题,百思不得其解.早上坐地铁,重新想这个问题.不成想这个问题还没弄明白,倒是明白了欧拉角万向 ...

  6. 欧拉角、万向节死锁理解

    欧拉角.万向节死锁理解 欧拉角理解 举例讲解 顺规.内旋与外旋 顺规 内旋与外旋 总结 东北天坐标系 数学表示 公式推导 举例计算 万向节死锁理解 说明 形象表示 数学表示 欧拉角理解 举例讲解 欧拉 ...

  7. 3D数学基础——欧拉角与万向节死锁

    欧拉角 欧拉角可以看做一个坐标,此坐标都是相对于同一个初始状态即(0,0,0)即物体坐标系和世界坐标系重合,且三角度都是0,从此初试状态开始,按照定义的旋转顺序,按照静态或动态的方式,旋转指定的角度, ...

  8. 欧拉角与万向节死锁(Euler angle Gimbal Lock)

    欧拉角 欧拉角有三种: 俯仰:Pitch(绕y轴旋转) 偏航:Yaw(绕z轴旋转) 翻滚:Roll(绕x轴旋转) 万向节死锁 下面的动图为死锁的一种情况,旋转层级为z > y > x,当y ...

  9. 欧拉角万向节死锁与四元数的相关资料

    欧拉角和四元数都可以用来描述物体的姿态.欧拉角的万向节死锁理解稍微奇怪.四元数原理的理解较为复杂.欧拉角和四元数之间可以做转换.这里收集了若干资料已做备忘. 万向节死锁(Gimbal Lock) : ...

  10. 欧拉角表示以及万向节死锁

    欧拉角 主要介绍欧拉角的表示,欧拉角的旋转,欧拉角的优缺点,以及欧拉角的万向节死锁 1.欧拉角的表示 欧拉角是一种基于三种较简单旋转运动(称为俯仰.滚动和偏航)创建一般旋转的机制.如下图,一架沿x轴方 ...

最新文章

  1. 我看过的编译原理方面的好文章
  2. 谷歌地图最新hosts_如何查看2020最新版谷歌地球高精度卫星地图(附下载方法)...
  3. 关于string类型的字符串是否以\0结尾
  4. python进阶-第二季第一章
  5. 如何遍历一个JS对象中的所有属性,输出键值对--我居然犯错半个小时
  6. IDL与C#混合编程技术
  7. 【Python】处理ConvergenceWarning: lbfgs failed to converge (status=1):STOP: ...
  8. 8位16位32位单片机区别
  9. 360手机浏览器_网信办出手:华为、360、qq等8款手机浏览器被列入首批重点整治名单...
  10. codevs1018 单词接龙(DFS)
  11. Git add 常见用法
  12. Android根据包名获取APP名称
  13. C语言求x个电阻并联的和的程序,C语言 计算并联电阻的阻值
  14. 显卡对应的Compute Capability值
  15. 面试题---测试用例设计
  16. 【Unity3D-Mirror多人坦克大战】子弹及其开火位置的生成、子弹开火逻辑(四)
  17. mac:系统存在两个Macintosh HD是怎么回事
  18. 试问甘心从年少轻狂到一事无成吗?
  19. cordova 调起拨打电话
  20. ZOJ 2975 Kinds of Fuwas(暴力)

热门文章

  1. 计算机应用在航天,国产CPU的航天计算机应用
  2. QQ盗号软件后门分析与反击
  3. python计算线段夹角
  4. 2021CCPC桂林游记
  5. 四川大学计算机博士申请考核条件,四川大学2020年博士招生章程发布!招1650人!...
  6. 光耦w314的各引脚图_单通道光耦ACPL-312U-500E设计,ACPL-W314-000E线路图
  7. 上海计算机考试分值,上海高考科目及分值
  8. 曲线救国 —— 删除数组的指定元素
  9. 支持软件是计算机软件,()是计算机必备的支持软件。
  10. 细说JVM系列:JVM存在的目的和意义是什么?