4

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

这就是我想要的。想象一下,我有非单位向量a = (0, 0, 2)b = (3, 1, 2). 遵循最初的汉密尔顿对四元数的定义q = a / b(这个定义是象征性的,因为你当然不能划分向量)。有关此概念,请参阅Wikipedia。由此我可以推断(也许这很天真)我能以某种方式找到这样qq * b = a.

换句话说,给定ab我想找到一个四元数q,乘以它b会给我a。请注意,我对简单的旋转(单一)四元数不感兴趣,它只会旋转ba. 实际上,除了旋转之外,我还希望将 norm ofb缩放到 norm of a

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

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

为什么不是math.stackexchange.com

因为我对彻底的数学推导或解释不感兴趣。我关心的是构造这种四元数的计算效率高的算法。不过,如果答案中包含这些细节,我真的很感激,也许其他人将来也会偶然发现同样的问题。

对于接近的选民:

继续并关闭查找代表从一个向量到另一个向量的旋转的四元数

此外,我已经正确标记了我的问题。我的问题属于 StackOverflow 中这些人口众多的标签。结果,您关闭的原因没有任何意义。

4

1 回答 1

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是与a和正交的单位向量b。和

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:嵌套叉积产生一个与 和 正交的向量,b并且n是 的长度|a|*|b|*|b|。点积部分添加到 上的投影ab按 的平方长度缩放b)。这使它与a. 一旦我们除掉 的平方长度b,剩下的就是a

现在,这是否真的有用的问题是不同的。find 并不是很有用a,因为您需要从一开始就拥有它。此外,很有可能q*c不会做你希望的事情,但你必须告诉我们那是什么。

于 2013-07-18T03:26:26.423 回答