四元数
版权声明:本文为博主原创文章,遵循 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