四元数简介

在我之前,网上各个博客各大网站都有很多关于四元数的介绍与讲解!但我总结了一下接三个字:看不懂!

说实话!

这真的是实话!

举个例子:

      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]。

猜你喜欢

转载自www.cnblogs.com/Dahsouh/p/9578387.html