复数与2D旋转
背景
考虑如图数轴,数轴上任何点可以做加法,也可以做乘法
我们考虑以下2个结论
1. 将1换到 -1的位置,将其他的数字乘以 -1 都会被送到关于原点对称的一点上,也就是说换个说法,我们认为乘以 -1 可以看作是旋转了 180°
2. 一个数乘以它本身,结果总是为正,如果乘以 -1 则认为是旋转半圈,再乘以 -1 则认为是回到了起始点
所以我们找不到一个数乘以它本身等于 -1(或者说找不到一个数乘以本身等于负数)
注:以 -1 为标准做归一化是为了方便统一计算
结论
此时会有一个问题,-1 没有平方根,可是数学家们是极富想象和创造力的,没有就创造一个承认它有,既然乘以 -1 是旋转 180°,那么它的平方根应该是转动它的一半 - 90°,这样我们就可以离开水平的直线拓展到一个不在直线中的平面上的点,将其引入并称之为 i****
引入复数 i 后,我们将直线拓展为复平面,从一维上升到二维,根据上述结论,我们认为乘以 i 等于旋转 90°,比如下图
所以,复数将一个实数上升到了二维,为实数添加了一个虚轴,使得实数可以虚轴方向上进行旋转操作
四元数
定义
q = w + ai + bj + ck,在复数的基础上引入j, k 两个虚轴,使得向量可以在i,j,k三个虚轴上进行旋转操作
w 为标量,v = ai + bj + ck 为矢量(向量)=> q = (w, v)
w = 0的四元数为纯四元数,记为 q = (0, v)
公式****
乘法:q = [s, v],p = [t, u] => qp = [st - vu, su + vt + v x u]
旋转:R = qvq*,q 为旋转四元数因子,q* 为 q 的逆,v为向量,R为旋转后的结果
前置条件
1. 四元数的模长 ||q|| =
2. 旋转前后模长不变
3. qq* = 1(q ≠ 0)
4. 所得结果应该为向量
公式中的难点
参考复数的乘法中,对一个实数/复平面的点做旋转只需要乘以一个旋转因子 i,但是在四元数的旋转公式中出现了qvq*,多出来一个q*
推导
给定单位圆的四元数 q = [cos a, u * sin a],q* = [cos a, -u * sin a],向量 v = [0, v]
根据旋转公式 r = qvq*,我们先求解qv
qv = [-uvsin a, vcos + (vxu)sin a ]
这时候对qv求出的结果,标量部分存在问题,因为在三维空间中,我们引入四元数后,旋转轴i, j, k 对应了坐标系x, y, z,而标量部分 -uvsin a 可能不为 0,则所得结果违反了前置条件2和4,为了解决这个问题,我们继续对qv处理,令qv = r,则 R = rq*
rq* = [0, vcos 2a + (1 - cos 2a)(u * v)u + (u x v)sin 2a]
即R = qvq* = rq* = [0, vcos 2a + (1 - cos 2a)(u * v)u + (u x v)sin 2a]
a 为旋转的角度,计算结果却出现了二倍角,所以在实际计算过程中,会令 a = a / 2
旋转公式推导较为复杂,不在此讨论,有兴趣可以参考以下链接
参考资料
四元数与三维空间旋转 | 线代启示录 (wordpress.com)
3Blue1Brown - Visualizing quaternions (4d numbers) with stereographic projection
烧脑高分纪录片【维度:数学漫步】Documentary [Dimension: Math Walk] - YouTube