一、四元数

  四元数本质上是个高阶复数,可视为复数的扩展,表达式为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. 从零开始学习Java多线程(一)

    1. 什么是进程? 对其概念需要自行goole,简单理解就是:进程是计算机系统进行资源分配和调度的基本单位,是正在运行程序的实体:每一个进程都有它自己的内存空间和系统资源:进程是线程的容器.如:打开I ...

  2. promise用法十道题

    JS是单线程语言,多数的网站不需要大量计算,程序耗时主要是在磁盘I/O和网络I/O上 ,虽然固态硬盘SSD读取很快,但是和CPU比起来却不在一个数量级上,而且网络上的一个数据包来回时间更慢,所以一些C ...

  3. Kafka 1.0.0集群安装

    环境 主机名 IP 地址 安装路径 系统 sht-sgmhadoopdn-01 172.16.101.58 /opt/kafka_2.12-1.0.0 /opt/kafka(软连接) CentOS L ...

  4. Myeclipse在debug模式下没加断点程序卡住,start模式下可以正常启动

    参考<eclipse在debug模式下卡住,start模式下可以启动>,地址:https://blog.csdn.net/jack_chen1994/article/details/761 ...

  5. IIS环境配置和项目部署

    本人实际工作项目中IIS部署,亲测可用~~ 具体步骤: 1.打开控制面板 2.打开程序和功能 3.打开或关闭Windous功能 然后勾选相关内容: 4.添加应用程序 先打开iis管理器页面(控制面板— ...

  6. [luogu P3313] [SDOI2014]旅行

    [luogu P3313] [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神 ...

  7. 虚拟机centos7 基础模板制作

    用于新模板制作,主要针对一些基本组件的安装 分区.安装不在此赘述 最小化安装centos7-minimal-1810 1.安装wget yum install wget -y 2.更换aliyun源 ...

  8. mybatis源码数据库链接配置

    <?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE configuration        ...

  9. Linux特殊符号

    第1章 回顾昨天 1.1 linux如何让一个服务/脚本开机自启动? chkconfig /etc/rc.local 1.2 被chkconfig管理 需要什么条件 1.2.1 必须放在/etc/in ...

  10. sql:按年、月、日钻取时间

    #按月排SELECT count(EN_NAME), DATE_FORMAT( CREATE_DATE, "%Y-%m" )FROM financeWHERE DATE_FORMA ...