四元数笔记
之前有一点复数基础,看了 3Blue1Brown 的四元数理解视频,但是还是没有完全理解四元数是怎么表示旋转的
在小豆发视频后,通过参考一篇知乎文章,加上自己的思考,终于大致理解了四元数的运作,可喜可贺可喜可贺
为此在这里把拼图大致总结一下,以表纪念
状态与作用
在研究旋转时,我们考虑的是数字的乘法
数字可以表示一个状态,也能表示一个作用,它们是一一对应的
例如,当用一个数字去乘时
2
表示将1
伸长为原来的2倍
-1
表示将1
逆向,长度保持不变
-3
表示将1
逆向,且长度变为原来的 3 倍
0
表示将1
长度变为 0
1
是一个特殊的作用,表示什么都不做
一个数的 n次方 表示做这个动作 n 次
0次方 表明做 0 次,也就是什么都不做,所以任意数的 0次方 都是 1
-1次方 表明做 -1 次,即对应操作的逆向操作,可以还原对应操作的影响
复数
我们定义一个新的作用 i, 让 i2=−1
如果 −1 是将 1 反转 180 度,不妨认为,i 的作用是将 1 旋转 90 度
以 {1,i} 为基向量,以向量的形式 (a,b) 表示 a+bi,称为复平面
这样的构造有很多符合直觉的巧合,略过不谈
关于 i 的作用
i(a+bi)=−b+ai
i 的作用就是将任意复数(向量) ,围绕原点,按照 1→i 的方向旋转 90 度
关于任意复数 q=q1+q2i 对任意复数 u=u1+u2i 的作用
q(u1+u2i)=(qu1+qu2i)
等价于以 {q,qi} 为基向量表示 (u1,u2)
(q1+q2i)u=(q1u+q2iu)
等价于以 {u,ui} 为基向量表示 (q1,q2)
任意复数 q 的作用,就是将任意复数,按照 1→q 的方向旋转并放缩
在单位圆上的复数 qu=(cosθ+isinθ)u 可以理解为,找到 u 方向,和 iu 方向,用横坐标(cosθ)去乘 u, 用纵坐标(sinθ)去乘 iu, 就是将 u 向 iu 旋转 θ
四元数
复数的定义并没有限定虚数单位是唯一的
我们定义
i2=j2=k2=−1
满足运算
ij=kjk=iki=j
ji=−kkj=−iik=−j
{1,i,j,k} 相互垂直,构成四维空间,以 {i,j,k} 按照右手标架组成三维空间,将实数轴隐藏起来,我们能描述四维旋转
关于 i/j/k 的作用
i(w+xi+yj+zk)=−x+wi−zj+yk
j(w+xi+yj+zk)=−y+zi+wj−xk
k(w+xi+yj+zk)=−z−yi+xj+wk
ijk 的作用就是将任意四元数(向量)
在 {1,i1,j1,k} 平面内的分量,围绕原点,按照 1→i1→j1→k 的方向旋转 90 度
在 {jki,kij} 平面内的分量,围绕原点,按照 j→kk→ii→j 的方向旋转 90 度,也就是按照右手定则旋转它的法平面
之后再把分量重新加起来即可
这其实也对应了四元数的定义
如果想要旋转任意角度,对于 h=i,j,k,只需要使用 cosθ+hsinθ 的形式即可
对于 {1,h} 和与其垂直的平面 Wh(在这里是 1,i,j,k 中剩下两个基向量组成的平面) 内的 u
找到 u 方向,和 hu 方向,用横坐标(cosθ)去乘 u, 用纵坐标(sinθ)去乘 hu, 就是将 u 向 hu 旋转 θ
由于对于每个 h,所有四元数都可以分解为这两个平面上向量的和,所以它可以应用到所有四元数上,它作用于一般四元数,表现为两个旋转的组合
这就是四维双旋转
事实上,这对单位球面上的任意四元数都成立,即只要满足 h2=−1 即可
使用单位超球面上的 q=cosθ+hsinθ, 就可以对任意四元数进行任意角度的四维双旋转
任意四元数相乘
计算
(q0+q1i+q2j+q3k)(u0+u1i+u2j+u3k)
将虚数部分用向量表示 Vq=q1i+q2j+q3k,Vu=u1i+u2j+u3k
则原式 =(q0+Vq)(u0+Vu)=q0u0+q0Vu+Vqu0+VqVu
接下来按照乘法分配律,计算
VqVu
若虚数单位相同,则变成 −1, 且值相乘, 于是有 −Vq⋅Vu
若虚数单位不同,则按照顺序,ij→kjk→iki→j,恰好等价于 iq1u1jq2u2kq3u3, 恰好是 Vq×Vu
于是
VqVu=−Vq⋅Vu+Vq×Vu
于是
qu=(q0+Vq)(u0+Vu)=q0u0+q0Vu+Vqu0−Vq⋅Vu+Vq×Vu
单位超球面上四元数的作用
设 q=cosθ+hsinθ, 其中 h 是 {i,j,k} 单位球面上的点,满足 h2=−1
设 u=u0+uhh+Vu,其中 Vu 垂直于 {1,h}
于是
qu=(cosθ+hsinθ)(u0+uhh+Vu)
=(cosθ+hsinθ)(u0+uhh)+(cosθ+hsinθ)Vu
由于 h2=−1,(cosθ+hsinθ)(u0+uhh) 就和正常的复数旋转一样
由于 Vu 垂直于 {1,h},h⋅Vu=0
(cosθ+hsinθ)Vu=Vucosθ+h×Vusinθ 也确实是按照右手定则旋转
四元数旋转
用单位球面上的向量是没法表示一个完整的三维旋转的
当它是姿态时,没法表示横滚角;当它是旋转轴时,没法表示旋转的角度
当然,可以把最后一个量存储在模长上
对于四元数表示的旋转,我们要旋转的目标向量是实部为 0, {i,j,k} 上的向量 u
现在的作用会让它在 {1,h} 上有多余的旋转, 我们需要抵消这个旋转
我们用 quq−1,q=cosθ+hsinθ 来表示让 u 绕 h 按右手定则旋转 2θ, 记为 ϕq(u)
−1 次方的含义是将影响还原,由于这里仅涉及旋转,把 θ 变成 −θ 即可
我们看看左乘变成右乘有什么变化
在
(p0+Vp)(q0+Vq)=p0q0+p0Vq+Vpq0−Vp⋅Vq+Vp×Vq
中,只有 Vp×Vq 不满足交换律
我们将对 u 的影响分解为在 {1,h} 上的和在 Wh 上的作用
则变成右乘不会对 {1,h} 上的作用产生影响
而对于 Wh 上的作用,Vucosθ−h×Vusinθ=Vucos(−θ)+h×Vusin(−θ), 等价于反向
因此,quq−1 时,
先左乘 q, {1,h} 上旋转 θ, Wh 上旋转 θ
再右乘 q−1, {1,h} 上旋转 −θ, Wh 上旋转 −(−θ)=θ
{1,h} 上的旋转被抵消,因此只有 Wh 上旋转了 2θ
所有向量的变化都可以被分解到这两个平面上,看起来就像是绕轴旋转了一样
用任意四元数来旋转
任意非零四元数都可以用 aq,q=cosθ+hsinθ 表示,其中 a 是非零实数
由于 q−1 的存在, aqu(aq)−1=aqua−1q−1=quq−1
所以同一个方向的四元数都表明同一个旋转,并不能缩放大小
参考资料