确定将一个向量发送到另一个向量的四元数

时间:2013-07-11 20:40:10

标签: algorithm math 3d linear-algebra quaternions

首先,这不是重复。所有其他看似相关的问题都要求四元数表示2个向量的方向之间的旋转,即解决方案没有考虑这两个向量的规范。

这就是我想要的。想象一下,我有非单位向量a = (0, 0, 2)b = (3, 1, 2)。遵循原始汉密尔顿对四元数q = a / b的定义(这个定义是象征性的,因为你当然不能分割向量)。请参阅 Wikipedia for this concept 。从那以后我可以推断出(也许是天真的)我可以找到q这样的q * b = a

换句话说,给定ab我想找到一个四元数q,当乘以b时,它会给我a。请注意,我对普通旋转(单一)四元数不感兴趣,只需将b旋转到a的方向。事实上,除了轮换之外,我还希望将b的范数缩放到a的范数。

是的,我知道我可以分两个阶段进行:使用标准的单一四元数方法旋转b,然后手动将旋转的b缩放到a的范数当然涉及额外的平方根(这是我在这里要避免的)。事实上,我想要这两个操作的计算有效组合,我觉得它是可以实现的,但是信息并不普遍,因为它似乎不是传统的用例。

也许我错了。请分享您的经验。谢谢。

为什么不math.stackexchange.com

因为我对彻底的数学推导或解释不感兴趣。我关心的是用于构造这种四元数的计算上有效的算法。尽管如此,如果这些细节将包含在答案中,我真的很感激,也可能是其他人在未来偶然遇到同样的问题。

关闭选民:

继续关闭Finding quaternion representing the rotation from one vector to another

此外,我已正确标记了我的问题。我的问题属于这些高度填充的标签,它们是StackOverflow的一部分。因此,你关闭的原因没有任何意义。

1 个答案:

答案 0 :(得分:1)

Daniel Fischer的评论答案是正确的。事实证明,有无限的方法来构造这样的四元数。问题归结为具有三个方程和四个变量的线性系统。它受到限制(如果我们假设我们将丢弃结果的[w]部分)。

也许我可以澄清费舍尔的答案。

当你将两个向量视为四元数并将它们相乘时,你会在[x,y,z]部分得到它们的交叉积,并在[w]部分得到它们的否定点积:

    | 0| | 0| |-ax*bx-ay*by-az*bz|
a*b=|ax|*|bx|=|    ay*bz-az*by   |
    |ay| |by| |    az*bx-ax*bz   |
    |az| |bz| |    ax*by-ay*bx   |

当你使用向量左移乘四元数时,得到相同的东西,但[w]部分缩放向量并将其添加回交叉积:

    |qw| | 0| |-qx*bx-qy*by-qz*bz|
q*b=|qx|*|bx|=| qy*bz-qz*by+qw*bx|
    |qy| |by| | qz*bx-qx*bz+qw*by|
    |qz| |bz| | qx*by-qy*bx+qw*bz|

回想一下

a x b = |a||b|sin(Θ)n

其中n是与ab正交的单位矢量。和

a . b = |a||b|cos(Θ)

向量的四元数共轭只是它的否定。

因此,如果我们看一下Fischer的等式:

a = q*b = |b|^{-2} * a * b' * b

我们可以看到

a*b' = | -dotP(a,-b)| 
       |crossP(a,-b)|

所以

a*b'*b = |        -dotP(crossP(a,-b),b)         |
         | crossP(crossP(a,-b),b) - dotP(a,-b)b |

此四元数的顶部([w])部分必须为零,因为它是两个正交矢量之间的点积。底部是a的缩放版本:嵌套的交叉产品生成与bn正交的向量,并且是|a|*|b|*|b|的长度。点积部分将a的投影添加到b上(按b的平方长度缩放)。这使它与a平行。一旦我们将b的平方长度除去,剩下的就是a

现在,这个实际上是否有用的问题是不同的。找到a并不是很有用,因为你需要先开始使用它。此外,q*c不会做你想要做的事情的可能性很大,但是你必须告诉我们这是什么。