到目前为止,我已经将这两个点转换成了一个单位向量。然后我希望直接将 i j k 插入虚部,并用零作为标量插入到四元数中。之后,我可以将一个四元数乘以另一个四元数的共轭,得到第三个四元数。这个第三个四元数可以转换成一个轴角,从而给出原始两个四元数之间的差异度数。
这个思路正确吗?所以应该只是 [ 0 i j k ]。之后可能需要对四元数进行归一化,但我不确定。
我有一种不好的预感,这不是从向量到四元数的直接映射。我尝试将单位向量转换为轴角,但我不确定这是否可行,因为我不知道要输入什么角度。
表示法
四元数定义在一个由基向量{1, i, j, k}组成的四维空间中。Hamilton将基本关系刻在都柏林的布罗姆桥上:
i2 = j2 = k2 = i j k= -1。
有许多等效的四元数参数化方法,但这里使用标量和向量形式。
1.) A = {a0, a} 以及 B = {b0, b},其中 A 和 B 是四元数,a0 和 b0 是标量,a 和 b 是三维向量。
2.) X = {0,x} 是一个向量四元数。
3.) (非交换的) 四元数积 直接源于上述i、j和k的属性,A⊗B = {a0 b0 - a.b, a0 b + b0 a + a x b}
4.) 四元数共轭 是 A* = {a0, -a}
5.) 四元数积的共轭 是反向顺序的共轭积。 (A⊗B)* = B*⊗A*
6.) 向量四元数的共轭 是其负数。 X* = {0, -x} = -X
7.) 四元数范数 是 |A| = √(A⊗A*) = √( a0² + a.a )
8.) 单位四元数的范数为1。
9.) 满足x . x = 1的三维单位向量x = {x1, x2, x3}可以表示为一个单位向量四元数X = {0, x}, |X| = 1。
10.) 绕着单位向量轴n旋转角度θ的四元数向量X的球面旋转是Q⊗X⊗Q*,其中Q是四元数{cos(θ/2), sin(θ/2) n}。注意,|Q| = 1。
注意四元数向量积的形式。给定向量四元数 X1 = { 0, x1 ) 和 X2 = { 0, x2 },四元数积为 X2⊗X1* = { x1.x2, x1 × x2 }。四元数将点积作为标量部分和叉积作为向量部分重新组合在一起,这两个积已经分离了一百多年。这些积中没有一个是可逆的,但四元数可以按照下面的方式进行。反演
找到球面变换四元数 Q12,以使向量 X1 旋转并与向量 X2 对齐。
从上面得到
X2 = Q12⊗X1⊗Q12*
将两边乘以X1*,
X2⊗X1*=Q12⊗X1⊗(Q12*⊗X1*)
请记住,旋转轴n源于叉积x1×x2,因此n.x1=0。而且Q*⊗X*=(X⊗Q)*=X*⊗Q,留下
X2⊗X1* = Q12⊗X1⊗X1*⊗Q12 = Q12⊗Q12
因此,四元数变换可以直接解决为:
Q12 = √(X2⊗X1*)
对于四元数平方根,需要自行解决。有很多方法可供选择,最佳方法将取决于您的应用程序,考虑速度和稳定性。
--祝好,
Fred Klingener