在我之前,网上各个博客各大网站都有很多关于四元数的介绍与讲解!但我总结了一下接三个字:看不懂!
说实话!
这真的是实话!
举个例子:
1. 旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转。矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按照一定的坐标轴顺序(例如先x、再y、最后z)、每个轴旋转一定角度来变换坐标或向量,它实际上是一系列坐标轴旋转的组合。
那么,四元数又是什么呢?简单来说,四元数本质上是一种高阶复数(听不懂了吧。。。),是一个四维空间,相对于复数的二维空间。我们高中的时候应该都学过复数,一个复数由实部和虚部组成,即x = a + bi,i是虚数单位,如果你还记得的话应该知道i^2 = -1。而四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位,i、j、k,即一个四元数可以表示为x = a + bi + cj + dk。那么,它和旋转为什么会有关系呢?
怎么样,看得懂吗?反正小编是被现实胖揍一顿!
那么,今天我们要怎么来介绍这个四元数呢?
我们来最简单暴力的!
重新定义一下这个怪物四元数!
Quaternion(四元数)用于计算和表示Unity旋转。它们计算紧凑高效,不受万向节死锁的困扰,并且可以很方便快速地进行球面插值。
Unity内部使用四元数来表示所有的旋转。
注意重点:
1,不受万向节死锁的困扰。
2,方便快速地进行球面插值。
3, Unity内部使用四元数来表示所有的旋转。
好了,现在你得重定义应该是这样的:
定义:Quaternion(四元数)用于计算和表示Unity旋转。
就像当初数学老师告诉你∏(pai)用来表示圆周率一样!
你有探究过∏(pai)是怎么算出来的吗?
但是你们是不是都知道怎么利用圆周率计算圆的面积呢?
类似的,对于初学者的我们,最重要的是现在要学会和记住四元数的使用方法。
我们来简单介绍一下:
1,四元数,顾名思义他有四个参数(x,y,z,w).(与三维坐标(x,y,z)相比,多了一个w参数!也是四元数最神秘的一个参数!)
2,xyzw的取值范围是[-1,1]。
3,初始值: (0,0,0,1)。
4,沿着y轴旋转:
180°(0,1,0,0)
360°(0,0,0,-1)
540°(0,-1,0,0)
720°(0,0,0,1)
5,沿着x轴旋转:
180°(-1,0,0,0)
360°(0,0,0,-1)
540°(1,0,0,0)
720°(0,0,0,1)
6,无旋转的写法是Quaternion.identify。
我们来介绍几个常用的方法(可以当作数学公式记忆):
-
Quaternion.LookRotation创建一个旋转,沿着forward(z轴)并且头部沿着upwards(y轴)的约束注视。也就是建立一个旋转,使z轴朝向view y轴朝向up。
-
Quaternion.Angle返回a和b两向量之间的角度。
-
Quaternion.Euler返回一个旋转角度,绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度(像这样的顺序)。
-
Quaternion.Slerp球形插值,通过t值from向to之间插值。参数取值范围[0,1]。
-
Quaternion.FromToRotation从fromDirection到toDirection创建一个旋转。
-
Quaternion.identity同一性旋转(只读)。
Quaternion 的基本数学方程为 :
Q = cos (a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k(z * sin(a/2)) (a 为旋转角度)
其中:
Q.w = cos (angle / 2)
Q.x = axis.x * sin (angle / 2)
Q.y = axis.y * sin (angle / 2)
Q.z = axis.z * sin (angle / 2)
上边这段有背景色的话基本上用不到,学有余力的同学可以深入研究一下!!
我们暂时能用到的四元数运算有两个:
1,四元数*四元数=四元数
例如:
quaternion * quaternion , q = t * p; 这是将一个点先进行t 操作旋转,然后进行p操作旋转.
2,四元数*三维向量=三维向量(特别注意:一定要是四元数在前,三维向量在后的乘法)。
例如 :
Quaternion * Vector3
t : Quaternion
p : Vector3
q:Vector3
q = t * p; 这是将点p 进性t 操作旋转;
特别注意:四元数*三维向量得到的是三维向量经四元数旋转操作后的三维向量。结果是一个三维向量!
关于四元数我们就先介绍这么多吧!有想深入了解的同学可以参看以下网站:
http://blog.csdn.net/candycat1992/article/details/41254799
https://www.cnblogs.com/driftingclouds/p/6626183.html
我们要用到坦克炮台旋转的知识点是:
Quaternion.Slerp球形插值,通过t值from向to之间插值。参数取值范围[0,1]。