3D数学基础(四)四元数和欧拉角
一、四元数
四元数本质上是个高阶复数,可视为复数的扩展,表达式为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数学基础(四)四元数和欧拉角的更多相关文章
- 3D数学基础:四元数与欧拉角之间的转换
在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...
- 3D数学基础:3D游戏动画中欧拉角与万向锁的理解
首先来看一下什么是欧拉角(Euler angles)?构件在三维空间中的有限转动,可依次用三个相对转角表示,即进动角.章动角和自旋角,这三个转角统称为欧拉角.——引自百度百科莱昂哈德·欧拉用欧拉角来描 ...
- 3D数学基础(一)Unity坐标系
Unity引擎时非常成熟的,引擎内部运用了很多的数学知识,他对开发者来说是不可见的,而且他已经封装好的算法也不是很全面.此外,要是使用引擎封装好的算法也要明白其实现的原理. 写过一些代码,也参考了一些 ...
- 四元数与欧拉角(RPY角)的相互转换
RPY角与Z-Y-X欧拉角 描述坐标系{B}相对于参考坐标系{A}的姿态有两种方式.第一种是绕固定(参考)坐标轴旋转:假设开始两个坐标系重合,先将{B}绕{A}的X轴旋转$\gamma$,然后绕{A} ...
- eigen 中四元数、欧拉角、旋转矩阵、旋转向量
一.旋转向量 1.0 初始化旋转向量:旋转角为alpha,旋转轴为(x,y,z) Eigen::AngleAxisd rotation_vector(alpha,Vector3d(x,y,z)) 1. ...
- 3D数学基础 KeyNote 1
[计算几何复习要点] 1.向量加法的几何含意: a+b的释意为:a的尾连上b的头,新建一条从a的尾指向b的头的向量. 2.向量减法的几何含意: a-b的释意为:尾部相连,新建一个从b的头指向a的头的向 ...
- 3D数学基础_图形与游戏开发
https://blog.csdn.net/popy007/article/list/2?t=1& //向量计算相关文章 https://www.baidu.com/link?url=48C ...
- 3D数学基础(三)矩阵
3D引擎中对于矩阵的使用非常多,介绍这些知识也是为了告诉开发者原理,更有助于开发者编写逻辑. (1)固定流水线 各种坐标系之间的转化是通过矩阵相乘得到的,这里面就涉及到了3D固定流水线.作为3D游戏开 ...
- 3D数学基础(二)向量
向量的基本运算包括加法.减法.点乘.叉乘.单位化运算等,而在游戏开发中使用最为广泛的是减法.点乘.叉乘.单位化运算.向量是具有方向和长度的矢量,有2D.3D.4D等的.在游戏开发里面一般使用的是2D和 ...
随机推荐
- 手动编译tomcat
0. 准备 (1) 配置好Java, 我这里使用的Oracle jdk 1.8.0_192; (2) 配置好Ant, 我这里使用的ant 1.10.5; (3) tomcat源代码, 我这里使用的 a ...
- index.html jquery
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 学号 20175212 《Java程序设计》第3周学习总结
学号 20175212 <Java程序设计>第3周学习总结 教材学习内容总结 一. Java--面向对象语言 核心内容为对象,一切围绕着对象.以下为三个重要性质: 封装性:将数据和对数据的 ...
- Oracle中 “ORA-14551: 无法在查询中执行 DML 操作” 如何解决
在编写一个数据库函数时,方法实现需要查询后进行修改,出现ora-14551的错误 create or replace function fun_DxcBillSn(tabType integer,ta ...
- vue中computed、metfods、watch的区别
一.computed和methods 我们可以将同一函数定义为一个 method 或者一个计算属性.对于最终的结果,两种方式确实是相同的. 不同的是computed计算属性是基于它们的依赖进行缓存的. ...
- C# Thread IsAlive 理解
IsAlive的功能就是判断当前线程是否处于活动状态. public class Program { public static void Main(string[] args) { try { Wr ...
- hdu1856
Mr Wang wants some boys to help him with a project. Because the project is rather complex, the more ...
- Linq 27个常用操作符说明
1.Where 操作符用于限定输入集合中的元素,将符合条件的元素组织声称一个序列结果.2.Select 操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中 ...
- 什么样的类才算是一种可重用的组件,即JavaBean?
每一个类实现了Bean的规范才可以由Spring来接管,那么Bean的规范是什么呢? 必须是个公有(public)类 有无参构造函数 用公共方法暴露内部成员属性(getter,setter) 实现这样 ...
- 洛谷P1993 小K的农场
思路是差分约束+dfs版SPFA. 首先来思考差分约束的过程,将题目给出的式子进行转化: 农场a比农场b至少多种植了c个单位的作物, SPFA我们考虑跑最短路,那么要让SPFA中满足的式子就是if(d ...