四元数简介——精选推荐

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四元数简介
在我之前,⽹上各个博客各⼤⽹站都有很多关于四元数的介绍与讲解!但我总结了⼀下接三个字:看不懂!
说实话!
这真的是实话!
举个例⼦:
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 操作旋转;
特别注意:四元数*三维向量得到的是三维向量经四元数旋转操作后的三维向量。

结果是⼀个三维向量!
关于四元数我们就先介绍这么多吧!有想深⼊了解的同学可以参看以下⽹站:
我们要⽤到坦克炮台旋转的知识点是:
Quaternion.Slerp球形插值,通过t值from向to之间插值。

参数取值范围[0,1]。

相关文档
最新文档