说起来,我把“齐次坐标”和“四元数”这两个概念搞混过很长一段时间,好像是最初听课的时候注意到了这个名词,再加上三维的齐次坐标正好又是四个数,就……理所当然地搞错了两个多月。
那就惯例得介绍一下,“旋转”相对来说是一种比较复杂的变换,二维下尚可想象,三维则难以名状。三维旋转给人直观的感觉就是“自由度”太大了,即使有欧拉角这种方法让三维旋转看上去有迹可循,但若给出一个简单如(1,1,1)的转轴也很难定量算出某向量绕其旋转的情况。
games101的课程中有一处拓展资料介绍了绕任意轴旋转的矩阵,但是我们今天使用另一种方式。
首先,我们把公式给抛出来~
单纯从使用角度来讲其实是非常快的。
所有向量写成四元数之后都是0+xi+yj+zk的格式,公式中的u就是转轴的单位四元数,那么转轴(1,1,1)就是√3/3i+√3/3j+√3/3k,v就是即将被旋转的四元数,v’就是旋转之后的四元数,θ就是旋转的角度,左右乘的一堆自然常数的幂需要用欧拉公式展开,展开之后就是三个四元数相乘了,乘完就是旋转的结果,结束!
接下来,开始解释为什么。这个看上去很规整的公式是如何影响三维旋转的?
证明公式之前我们需要从数学角度看一下四元数这个概念。 那么,复数是我们都认识的,形如
这样的,从接触到负数的开方让我们认识了虚数单位
四元数其实跟复数很像,它就是一种超复数,就像
其中i和j平方都为-1,这样的就是四元数。和复数一样需要定义这三个特殊单位,可能上面看到的定义和网上搜索到的不同,其实是等价的,把这个连等式左右都倒一倒乘一乘就能得到下面这个更能常见的定义
从这里开始要区分左乘和右乘了,得秉持“没有提到满足交换律的时候就认为其不满足”的原则。这似乎和矩阵的性质差不多,后面也有更多相似的性质,可以类比来理解
四元数还可以表示为实数部分+向量部分,如下图,本来的bi+cj+dk可以转换为三维向量,这也是四元数和旋转联系起来的基础
四元数的模同样是类似于向量长度和复数模的定义,平方和开方即可
接下来就要定义四元数的相关运算,我们直接跳过加法,减法和数乘的定义,图片我贴在下面这三个运算都可以一眼看懂
比较复杂的部分是四元数的乘法和“除法”,乘法你说它复杂也不算,说简单看上去又一大片,本质上就是4项与4项的多项式相乘再化简,下面图里是我手写的过程,只要注意下符号慢慢写都是能推出来的
我们通过观察整理出的式子,能得到这么一个经验性的结论“两个四元数相乘,其结果的实数部分等于原本两个实数部分相乘减去原本两个向量部分点乘,其结果的向量部分等于原本两个四元数的实数向量交叉相乘求和再加上两个向量部分的叉乘”。虽然一般情况下也不会手算乘法,但是记一下这个结论在本篇证明里还是很有用的。 另外,从结果中能看出由于包含了向量叉乘,所以四元数的乘法也就不满足交换律了
最后一个除法,不太方便直接给出除法定义,和矩阵、复数一样我们会通过四元数的逆来表示“除法”操作
互相乘起来结果是1,那么他们就互为对方的逆。对于怎么求一个四元数的逆,还是经典的办法,规定如下的q*为四元数的共轭
将其与q相乘会发现不管何种顺序结果都是模的平方,接下来我们在逆的定义式里左右都左乘q共轭,就又得到了看上去非常有矩阵既视感的公式
这个算起来公式还是有点麻烦,还记得上面说旋转为什么专门提了一个单位四元数吗?如果四元数模长是1,那么它的逆就等于共轭了,这下方便多了
下面将要介绍一位老朋友,欧拉公式。
解释就是,等式左边等于等式右边(?) 想要不那么严谨的求证可以把左右都泰勒展开一下,会发现它们相等,之所以说不严谨是因为默认把虚数单位当成可展开了。 它为虚数指数幂提供了运算的可能,那么我们就会想四元数是不是也满足欧拉公式?
很可惜,事实是不满足,但我们有办法加一些条件让它满足。既然i^2 = -1,就尝试找一下平方等于负一的四元数q。 那么,开始解方程
这个时候,向量部分需要为0,就有了两种情况,一个一个来看
如果v=0会因为实数平方不能为-1而得到空解。所以只能a=0,此时得到原向量部分模长为1。
于是就得到了,实数部分为0且向量部分模长为1的四元数,其平方为-1,我们称之为“单位纯四元数”。对于单位纯四元数来说是符合欧拉公式的
这里可以引申一下四元数的几何意义,它并不是代表一个四维空间的位置,可以这么来理解,实轴Re垂直于三维空间Oxyz,四元数的向量部分代表着三维空间内的一个向量,实数部分代表的是整个空间在实轴Re上的平移量。
对于单位纯四元数u,就代表一个实轴平移量为0,又在半径为1的球面上的向量
终于,正题要开始了……重新描述一下问题,四元数v绕单位纯四元数u旋转,为什么旋转后的四元数是pvp*,p = e^(θu/2)
这种很偏推导的部分打公式有点麻烦……,所以下面就配合手写讲解步骤了
- 对两个毫无位置关系的向量显然不方便表示旋转,但是可以拆分一下v,将其分解到平行于转轴u与垂直于转轴u两个方向上,旋转v就可以看成分别旋转v1和v2,再把它们两个加起来。
- 因为v2平行于转轴,所以v2旋转后的v2’等于自身
- v1垂直于转轴。现在我们挪动一下视角,令u垂直向外指向眼睛,可以想象出v1的旋转就是在纸面上转动θ角度
- 但即使这样,旋转后的v1’仍然不好表示,如果我们能知道这个视角下,在纸面上与v1垂直且等大的中间向量t,就能用cosθv1 + sinθt来表示旋转后的v1’了(我写的时候没有标这个向量t,但是大家应该能找到是哪一个)
- 回想四元数的乘法格式,我们试算一下u乘v1,两位实数部分都是0,又因为垂直点乘也是0,所以乘之后实数部分也为0,非常巧的的得到了这两个四元数相乘结果就是两向量叉乘。因为u长度为1,夹角又是90°,又非常巧的两向量叉乘正好就是纸面上这个垂直等大的向量t。
- v1’最后可以使用欧拉公式化简成指数幂形式
- 为方便后续证明,这里取p=e^(θu/2),其共轭p*=e^(-θu/2)
- 至此推理得到v’=ppv1 + v2
- 展开一下要证明的公式,v‘=pv1p* + pv2p*
- 对比一下形式,可以知道离真相只差pv1=v1p和pv2=v2p*两步了
上半完毕,喝个水休息一下开始下半……
- 先挑简单的来看,现在我们想象一下u与实轴Re这两条线,展开了一张平面
- 因为u平方是-1,所以这个平面其实就等价于复平面,其平面内的任何一个向量都可以用形如q=re^(uα)来表示。于是有一个性质
- 复数是满足交换律的↓
- 复平面上的数是满足交换律的↓
- 在u与Re形成的平面上的任何两个四元数是满足交换律的
- 因为v2和u平行,它一定在这个平面上,p*=e^(-θu/2)也在这个平面上,那么它们满足交换律,也就不用再往下证明了
- 对另一边的v1就不行了,因为v1显然没有在这个平面上,但我们不妨取一个任意在这个平面上的四元数q=re^(uα),尝试算一下q和v1满不满足上面的式子
- 上图里比较明显的三行就是展开计算过程了,没有什么特别复杂的,只要别被叉乘绕懵就可以了。还有个比较抽象的点,就在纸上左上角图中,u,v1,u×v1,Re这四条线是,相互垂直的,这实在是画不出来效果,Re既然垂直于这个空间,当然也就垂直于空间中的每一条线
- 化简完毕后我们就非常开心地得到了三角恒等式。证毕!