四元数左乘右乘_四元数——旋转

四元数系列:

—————————————————————————————————————————

首先很感谢各位的支持,本来我也就是说写个自己看的笔记啥的,没想到那么多人点赞。本篇主要介绍旋转相关的知识,其中会尽量把我认为精彩的部分说细一点,更像教程的方式去叙述,但是基础性的公式证明应该还是不会提,毕竟篇幅有限。

0.胡尔韦兹定理

这部分内容很尴尬,本想都塞到下文中用到的地方讲,但又怕跳戏。正好结合上篇中评论区的一些反馈,把部分四元数的性质单拎出来放在最前面讲。

上篇四元数定义中,为了完整性,我提到了三元数或五元数理论上可能存在,但因为不满足模运算,所以没有意义。这里先将三元数放在一边,我们着重讨论一下为什么存在四元数、八元数,换种说法,它们有什么非常重要的共通性质?

我参考的教材提到这样一个词Composition Algebras,恕我愚笨没有在Wiki找到对应的中文译名。不过找到更为有意思的两个词条,赋范可除代数和胡尔韦兹(Hurwitz)定理。我们下面分别来看这两个定义。

赋范可除代数是一个在实数域或复数域上的可除代数,即对所有处于域中的x和y均满足

也就是说两个数(这里可能是数,可能是向量,取决于代数域的维度)相“乘”后的模长等于分别模长的乘积。那到底有多少个域满足这个代数的条件呢?胡尔韦兹就证明了 赋范可除代数只同构于一下四个代数:(1)实数R;(2)复数,记号为C;(3)四元数,记号为H;(4)八元数,记号为O。这个就被称为胡尔韦兹定理,也叫做1, 2, 4, 8定理。

这就厉害了,也就是说对于“乘法”而言,只有一维实数,二维复数,四维四元数等是满足可除的,其中四元数的“乘法”是★操作。我之前所提到的模运算也就是指这个。下面我们举两个例子说明一下这个赋范可除代数到底容不容易满足,我们研究旋转,就挑三维向量的内积和外积。内积|x·y|=|x|·|y|·cosθ,外积|x×y|=|x|·|y|·sinθ,可以很明显看到不满足可除性,所以说即使是单位向量之间叉乘,得到的法向量也未必是单位长度的。

这个性质别看简单,但基本上算是非常核心的一个性质。为什么我要用四元数表示旋转?旋转最本质的特点是什么,就是不改变相对距离,你转个手臂不可能转个60度手变长了。用数学公式说明,就是假如x是单位四元数,当我一个任意向量y通过x进行旋转后,模长是不会发生变化的。因此,赋范可除代数的应用就在这。当然四元数旋转比这复杂,这个后文慢慢说。

1.复数和二维旋转

复数相乘可以旋转的性质想必大家都很清楚,乘以i可以逆时针(朝+i方向)旋转90°,乘以-i可以顺时针旋转90°。我这里就不想再画图解释一下浪费笔墨了,仅列出一个公式。

其中推导公式中暗含了一个欧拉公式,包含sinθ和cosθ的矩阵就是我们常见的二维旋转矩阵。可以发现二维旋转矩阵其实也对应着一个类似四元数的一个向量表达形式,就是复数。我们对矩阵进行求逆(主交换,次变号),发现其实对应的就是复数的共轭形式。也就是说cosθ+i·sinθ可以旋转θ,而cosθ-i·sinθ可以旋转-θ。这个特性上的优势在四元数和三维旋转矩阵中就更明显了。

那我们来讨论两个关于复数与四元数的问题。

第一个问题是为什么单位复数的公式里不像四元数一样用θ/2,而用θ表示?当然,复数表示旋转可以用θ/2表示,我们设a=cos(θ/2),b=sin(θ/2),可以得到下面的式子。

这个公式有用吗,其实用处不大,但确实有教材去讨论这个形式。那我们把问题换一下,为什么复数可以用一个θ去完成旋转,而四元数只能分两个θ/2去完成呢?这个问题后面四元数再说,我先把结论说了,也就是马上说的第二个问题。

第二问题是为什么二维旋转可以交换?在三维旋转中先绕x旋转,在绕y旋转和先绕y旋转,在绕x旋转肯定是不一样的,具体看图。那我们在二维旋转中先转90°再转45°肯定和先转45°再转90°是一样的。究其根本,是二维旋转它首先就隐藏了一个非常重要的因素,就是旋转轴永远是垂直于二维平面的,也是固定的,在二维中无论怎么旋转,都是共面的。放到三维空间,旋转之所以存在次序性,之所以不能交换,是旋转轴可以跟向量成任意角度。如果你放到一个二维子空间里面去旋转,你依然可以满足交换性。至于这个旋转轴垂直为啥可以解释第一个问题,我后面会慢慢说的。

2.三维旋转

这部分我就不说了,什么欧拉角、矩阵的正交性、四元数转矩阵等等与其看我说,不如找本Graphics教材,基本靠谱点的书都会有说,不过再往深点估计就要找一些数学书看了。这里分享一个轴角公式的推导方法,该方法的思路基本用于动画或者是游戏的方方面面。

首先,我们又扯到上篇文章说的two-sphere,也就是通常意义上的球体。轴角一般表示为旋转轴和角度,概念就跟力矩没两样,那我们单看旋转轴,归一化后的旋转轴其实就是球体上面的一个点。那我们用极坐标来表示(cosα·sinβ,sinα·sinβ,cosβ)。

然后,我们就要去旋转角度了。欧拉角是一种应用很广但其实很有缺陷的旋转表现形式,那为啥有缺陷为啥还应用广泛呢?主要原因就是简单。我们绕着x轴旋转比绕任意轴要简单许多,那么处理轴角的思路就是把轴旋转到z轴,进行旋转后,再旋转回原来位置。具体公式(轴角公式)和示意图如下。

这种绕回去再绕回来思路很常用。比如现在做场景都分世界坐标和局部坐标,把动画角色放在局部坐标,那么旋转就很方便。如果非要把动画角色放世界坐标,那么旋转就很痛苦,要把角色先移回原点旋转后在移回原来的位置。类似的问题还有很多,当然四元数旋转公式其实也是这种思路。

3.四元数旋转

扯了一大堆,要说到正题了。虽说废话了点,但我上面说的每一个知识点这一节都会用到。

用作旋转的是单位四元数这一点毋庸置疑,那三维向量我们怎么表示?这里就要提到我们上次所说的纯四元数(Pure Quaternion),表示为{0, p},就是w=0的四元数。其实上回已经分析过这个空间了,处于四维空间中w=0的三维子空间(可以和三维空间z=0的二维子空间XOZ平面进行类比理解)。纯四元数不等同于单位四元数,它们是不同的东西,但有交集,交集就是three-sphere在该空间的投影,是一个two-sphere的球体。纯四元数中p中i, j, k就可以跟三维向量x, y, z对应起来。

接着我们对其乘以单位四元数,也就进行旋转得到如下式子。

不着急往下算,我们先来观察这个式子,我们希望最终得到的四元数是什么样子?

第一,和原来模长一样。我们把两边取模,根据胡尔韦兹定理,右边的模长就是q的模长乘以p的模长,q是单位四元数,所以前后模长一致,很符合我们的要求。

第二,还得是纯四元数,因为我三维向量映射到四维还得映射回去,那么纯四元数是必须的,如果脱离这个三维子空间,映射关系就变了。看看结果,这个就比较麻烦了,因为我们发现w不为0,它是有值得。

3.1 四元数旋转的特例

什么时候w=0,垂直。这就是特例,我们先研究特例。我们把w=0,s=cosθ,λ=sinθ代入上面的式子,得到

其中叉乘的部分模长等于p,所以s²+λ²=1,又从代数的角度证明了模长前后不变。那我们拿实例去证明一下。

这是旋转45°的情况。

这是旋转-45°的情况。上面例子暗含了两个点,其一就是共轭其实就是逆,其二就是左乘右乘也是一个逆的操作。

这种特殊情况下的四元数旋转其实就跟复数是非常类似的,因为旋转轴与向量垂直,导致旋转后的结果永远都是在三维子空间中,所以一次θ旋转就可以得到结果(这句话说的不妥,参照一般形式就可以理解),跟复数很类似。而且共轴旋转之间是可以交换的,它们的旋转轴是固定的,就是先转90°再转45°肯定和先转45°再转90°是一样的。但是注意,p和q之间是不满足交换的,例子就是很好的说明。

3.2 四元数旋转的一般形式

不垂直,w≠0,那么问题就麻烦了。在解决问题之前,还是来想一下,我们可以知道旋转过后的向量模长不变,但w有值,意味着它不在纯四元数所在的三维子空间了,它跑到四维空间了,那我们没办法映射回去了。怎么办?那我们用一下三维旋转思路,就是把旋转出去的向量给旋转回来,根据三维旋转的公式,向量在右边成了一个旋转矩阵的转置,正交矩阵转置等于逆,四元数的逆也就是共轭,那我们在q·p的右边再乘以一个逆。

我们首先证明一下向量旋转后模长不变,如下图。

然后就两个问题深入的分析一下。一是为什么乘以共轭就变成了纯四元数?这个就比较难从几何角度去思考,毕竟四维的一个旋转,我们从代数的角度看一下。

已经写得很清楚了,在这种情况w是恒等于0的。另一个问题就是为什么要换成θ/2,很多人说要旋转二次,所以均值一下,每次旋转一半。道理是没错,不过我们还是继续用代数的角度去看一看,上面的式子还能往下化简。

这个证明我少个步骤,不过后面会给证明。写到这,我估计大家都看明白了,向量结果里θ全都变成2倍了,所以需要改为θ/2以保证最终只旋转θ角度。我们这时再来看复数当中的第一个问题,为什么复数直接旋转θ就可以了。因为当旋转轴与向量垂直时,旋转后的向量永远与原向量处于同一个空间;而一般形式下的四元数旋转,旋转轴与向量并不是垂直的,旋转会将原向量偏离三维子空间,需要再乘以共轭形式旋转回来,所以需要两次旋转,所以不能直接旋转θ角度。

四元数与旋转整体体系就写完了!基本到这从理解上这么多就够用了,如果只是用,我觉得公式拿过来就OK了。后面还会有两篇关于四元数的应用,一篇我自己来写,也就是常用的 Slerp、Gimbal Lock等问题;另一篇请了个高人来写,内容是什么就暂且保密,尽情期待,虽然不知道什么时候能发出来。

附录

最后再来点干货,四元数矩阵一般形式那块其实用了一个公式

这个公式叫二重外积公式,就是(x×y)×z=(x·z)·y-(y·z)·x,英文名称叫vector triple product,大家自己也可以去Google上面找方法。比较常见的一种是用行列式硬算,比较笨自然不推荐;另一种是用Einstein's求和约定,这个呢又是耍流氓,我还得去理解新的知识点。不过好在我从一本张量分析的教材看到了比较优雅又不难懂的方法,在加上自己一点理解,现在分享给大家。

先看特例,就是上面的公式。其中v为单位向量,左边叉乘的结果一定是与p和v共面的,且与v垂直的,因为平面和法向量是一一对应的。再看下图,证毕。

在看一半形式,其中叉乘的结果一定是与x和y共面的,下面我直接粘贴原文了,毕竟不是自己的干货,内容也不太多,手动打字画图实在是太累了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值