一、四元数

  四元数本质上是个高阶复数,可视为复数的扩展,表达式为y=a+bi+cj+dk。在说矩阵旋转的时候提到了它,当然四元数在Unity里面主要作用也在于此。在Unity编辑器中的Transform组件,包括这位置(Position)、旋转(Rotation)和缩放(Scale).Rotation就是一个四元数,但是不能直接对Quaterian.Rotation赋值。可以使用函数Quaterian.Eular(Vector3 angle)获取四元数,该函数返回的就是四元数。

  欧拉角表示为Quaterion.eulerAngles,欧拉角可以对其进行赋值,例如

  Quaterion.eulerAngles=new Vector3(0,30,0);

  四元数可以用来进行旋转,它的表达式为Quaterion.AngleAxis(float angle,Vector3 axis),调用这个函数可以对物体进行旋转,当然还需要调用函数Quaternion.Lerp()在旋转时进行插值计算,这些函数都是在编写逻辑时调用的。

  如果对于四元数理解的不够清楚,推荐阅读这篇文章Understanding Quaternion中文翻译  http://www.qiujiawei.com/understanding-quaternions/

二、欧拉角

  欧拉角也是用于旋转的,但是它有一个致命的缺点,就是万向节死锁,欧拉角旋转我们在Unity开发中通常使用的函数是transform.Rotate(Vector3 angle)

  万向节死锁就是在3D空间中某两个轴在旋转时重叠了,不论你如何旋转,三个轴就变成了两个轴。举个例子:

  transform.Rotate(new Vector3(0,0,40));

  transform.Rotate(new Vector3(0,90,0));

  transform.Rotate(new Vector3(80,0,0));

  我们只需要固定中间一句代码,即使y轴的旋转角度始终为90°,那么你会发现无论怎么样调整x轴和z轴的旋转角度,它们会总是在同一个平面上运动。万向节锁实际上并没有锁住任何一个旋转轴,知识在这种情况下会感觉丧失了一个维度。以上面的例子还说,尽管固定了第二个旋转轴的角度为90°,但我们原以为依靠改变其他两个州的旋转角度是可以得到任意旋转位置的(因为按照我们的理解,两个周应该控制两个空间维度),而事实是它被锁在一个平面上了,即只有一个维度了,缺失了一个维度。而只要第二个旋转轴不是正负90°,我们就可以依靠改变其他两个轴的旋转角度来的到任意旋转位置。

  从最简单的理解,还是用x,y,z的旋转顺序。当y轴的旋转角度为90°时,会得到下面的矩阵。

  

  

  在改变第一次和第三次的旋转角度时,同样的效果,不会改变第一行和第三列的数值,从而缺失了一个维度。究其出现的本质原因,是因为从欧拉角到旋转的映射并不是一个覆盖映射,即不同的欧拉角可以表示同一个旋转方向,而且并不是每一个旋转变化都可以用欧拉角来表示的。

3D数学基础(四)四元数和欧拉角的更多相关文章

  1. 3D数学基础:四元数与欧拉角之间的转换

    在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...

  2. 3D数学基础:3D游戏动画中欧拉角与万向锁的理解

    首先来看一下什么是欧拉角(Euler angles)?构件在三维空间中的有限转动,可依次用三个相对转角表示,即进动角.章动角和自旋角,这三个转角统称为欧拉角.——引自百度百科莱昂哈德·欧拉用欧拉角来描 ...

  3. 3D数学基础(一)Unity坐标系

    Unity引擎时非常成熟的,引擎内部运用了很多的数学知识,他对开发者来说是不可见的,而且他已经封装好的算法也不是很全面.此外,要是使用引擎封装好的算法也要明白其实现的原理. 写过一些代码,也参考了一些 ...

  4. 四元数与欧拉角(RPY角)的相互转换

    RPY角与Z-Y-X欧拉角 描述坐标系{B}相对于参考坐标系{A}的姿态有两种方式.第一种是绕固定(参考)坐标轴旋转:假设开始两个坐标系重合,先将{B}绕{A}的X轴旋转$\gamma$,然后绕{A} ...

  5. eigen 中四元数、欧拉角、旋转矩阵、旋转向量

    一.旋转向量 1.0 初始化旋转向量:旋转角为alpha,旋转轴为(x,y,z) Eigen::AngleAxisd rotation_vector(alpha,Vector3d(x,y,z)) 1. ...

  6. 3D数学基础 KeyNote 1

    [计算几何复习要点] 1.向量加法的几何含意: a+b的释意为:a的尾连上b的头,新建一条从a的尾指向b的头的向量. 2.向量减法的几何含意: a-b的释意为:尾部相连,新建一个从b的头指向a的头的向 ...

  7. 3D数学基础_图形与游戏开发

    https://blog.csdn.net/popy007/article/list/2?t=1&  //向量计算相关文章 https://www.baidu.com/link?url=48C ...

  8. 3D数学基础(三)矩阵

    3D引擎中对于矩阵的使用非常多,介绍这些知识也是为了告诉开发者原理,更有助于开发者编写逻辑. (1)固定流水线 各种坐标系之间的转化是通过矩阵相乘得到的,这里面就涉及到了3D固定流水线.作为3D游戏开 ...

  9. 3D数学基础(二)向量

    向量的基本运算包括加法.减法.点乘.叉乘.单位化运算等,而在游戏开发中使用最为广泛的是减法.点乘.叉乘.单位化运算.向量是具有方向和长度的矢量,有2D.3D.4D等的.在游戏开发里面一般使用的是2D和 ...

随机推荐

  1. macaca 初试

    看到macaca的介绍,在移动端和PC端的自动化UI测试都同时支持, 联想到最近的行业都是同时对移动端和PC端(较少,几乎不维护)追求UI自动化测试,打算拿来试一下. 首先上macaca的地址:htt ...

  2. springcloud-feign组件实现声明式的调用

    11.使用feign实现声明式的调用 使用RestTemplate+ribbon已经可以完成对服务端负载均衡的调用,为什么还要使用feign? @RequestMapping("/hi&qu ...

  3. Ubuntu配置MYSQL远程连接

    一.修改mysql权限 1.mysql -u root -p  回车输入密码 2.use mysql:      打开数据库 3.将host设置为%表示任何ip都能连接mysql,当然您也可以将hos ...

  4. java操作svn工具类SvnUtil

    直接上代码,工作中使用的版本,记录下. public class SvnUtil { private static Logger logger = Logger.getLogger(SvnUtil.c ...

  5. 运用python发邮件

    1.网上有许多发送邮件的代码,运行了几次都不成功(使用python3),转用Python2之后,发送成功 2.代码样例: 参考教程:http://www.runoob.com/python/pytho ...

  6. 电梯问题——致敬ACM

      The Fair Nut and Elevator     time limit per test 1 second memory limit per test 256 megabytes inp ...

  7. python之路-pyc

    一.解释型语言和编译型语言 解释性语言:在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言.运行时就不需要翻译,而直接执行就可以了.最典型的例子就是C语言. 编译型语言:没有 ...

  8. 较为复杂的实现Parcelable的子类--推荐Android中使用

    2017-08-14 21:23:34 一个较为复杂的Parcelable实现类 public class CommentShareBean implements Parcelable { /** * ...

  9. JS中一些常用的兼容写法

    1.滚动条到顶端的距离var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;2.滚动条到左端的距离 ...

  10. 用户认证:基于jwt和session的区别和优缺点

    背景知识: Authentication和Authorization的区别: Authentication:用户认证,指的是验证用户的身份,例如你希望以小A的身份登录,那么应用程序需要通过用户名和密码 ...