四元数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ecidevilin/article/details/77937109
何为四元数?讲解四元数的文章往往会把四元数跟复数联系在一起。诚然,四元数的起源跟复数有关系,但是理解复数系统并不是理解四元数的首要条件。
提到四元数,我们首先要提到一个人——莱昂哈德·欧拉(Leonhard Euler),根据欧拉旋转定理(wiki),在三维空间里,假设一个刚体在做一个位移的时候,刚体内部至少有一点固定不动,则此位移等价于一个绕着包含那固定点的固定轴的旋转。还有另外一种阐述:3D中的任意角位移都能表示为绕单一轴的单一旋转。如图所示:

 

所谓角位移也就是旋转,我们通常用欧拉角表示,这也是最容易理解的一种形式。

那么轴-角形式跟四元数有什么关系?它们并不等同,但是却也密不可分。

上图的四元数表示法:

q=[cos(θ/2) sin(θ/2)e]

注意这里e是图中的向量,即

q=[cos(θ/2) sin(θ/2)ex sin(θ/2)ey sin(θ/2)ez]

 

那么接着我们就要讨论四元数跟复数的关系了,首先先把William Hamilton这个四元数的发明者提出来,免得大家觉得没意思跳过了这段。

首先,什么是复数?

我们知道在实数范围里,对负数开方是没有意义的。但是偏偏有人愿意做“没有意义”(注意这里是引号)的事情,于是定义了虚数i,i的平方等于-1。

那么当实数和虚数加在一起,便成为了复数。

a+bi

其中a被称为实部,b被成为虚部。

因为有实部和虚部,所以我们可以认为在复数集存在于一个2D平面(复数平面,又称高斯平面)上,两个轴分别为实轴和虚轴,这样x+yi就可以视作一个2D的点P为(x,y)。

 

当P绕原点旋转角度θ时

 

我们可以用另外一个复数来表示这个旋转:

q=cosθ+isinθ

旋转后的点

p1=pq=(x+yi)(cosθ+isinθ)=(xcosθ-ysinθ)+(xsinθ+ycosθ)i

因为i的平方为-1,所以复数为我们提供了一个有趣的旋转的表示法。(我们可以将这里的q理解为“2D平面上的四元数”,但其实他们之间还是有区别的)

然后我们的主角终于登场了,爱尔兰数学家William Hamilton多年来一直致力于寻找一种方法将复数从2D扩展到3D。他认为,这种新的复数应该有一个实部和两个虚部。然而,Hamilton一直没有办法创造出一种有两个虚部的有意义的复数。但故事并没有结束,1843年,在赴皇家爱尔兰学院演讲的路上,他突然意识到应该有三个虚部而不是两个。他把定义这种新复数类型性质的等式刻在Broome桥上。这样,四元数就诞生了。(本段抄自《3D数学基础:图形与游戏开发》)

四元数扩展了复数系统,它使用三个虚部i,j,k。它们的关系如下:

ii=jj=kk=-1

ij=k,ji=-k

jk=i,kj=-i

ki=j,ik=-j

一个四元数[w, x, y, z]定义了复数w+xi+yj+zk。

具体四元数的一些公式,我们有缘再讲,只是有一个必须要提一下,这也是2D和3D上的区别。

定义三维上的点(x,y,z)在四元数空间上的坐标p=[0,x,y,z],那么如何让这个点绕轴e旋转θ?我们设绕轴e旋转θ对应的四元数为q,那么旋转后的点为:

p1=qpq-1

其中q-1为q的逆(等于q的共轭复数除以q的模,[w,x,y,z]的共轭为[w,-x,-y,-z],模的定义与向量模类似,为各项平方和的开方)。

(Unity3D里我们可以直接用四元数Quaternion乘以向量Vector3,得到旋转后的点)

最后提一句,四元数可以解决欧拉角的万向锁问题和别名问题(所以U3D里使用Quaternion来保存旋转)。
————————————————
版权声明:本文为CSDN博主「凯奥斯」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ecidevilin/article/details/77937109

posted @ 2019-11-01 16:54  天马yp  阅读(486)  评论(0编辑  收藏  举报