【问题标题】:Determine Quaternion Which Sends One Vector into Another确定将一个向量发送到另一个向量的四元数
【发布时间】:2013-07-10 07:08:56
【问题描述】:

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

这就是我想要的。想象一下,我有非单位向量 a = (0, 0, 2)b = (3, 1, 2)。遵循最初的汉密尔顿对四元数的定义q = a / b(这个定义是象征性的,因为你当然不能划分向量)。请参阅Wikipedia for this concept。从中我可以推断(也许这很天真)我能以某种方式找到qq * 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 中这些人口众多的标签。因此,您关闭的理由没有任何意义。

【问题讨论】:

  • 就四元数而言,你有conjugate(x)*x = norm(x)^2。真正的四元数是中心的(与所有四元数交换),所以q = 1/norm(b)^2 * a * conjugate(b) 将满足q*b = a,并且不涉及平方根。
  • 这可能更适合math.stackexchange.com
  • @BlueRaja:不,我的问题与编程更相关,我对算法感兴趣,而不是深入的数学理解(尽管如果包含在答案中也很好)。
  • @Daniel Fischer:对不起,我对q = 1/norm(b)^2 * a * conjugate(b) 公式有点困惑。 ab 是向量,而不是四元数。我错过了什么吗?如何用向量构造四元数?出于同样的原因,conjugate(b) 看起来很奇怪。
  • 对于所有亲密的选民:继续并关闭stackoverflow.com/questions/1171849/…

标签: algorithm math 3d linear-algebra quaternions


【解决方案1】:

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

也许我可以澄清 Fischer 的答案。

当您将两个向量视为四元数并将它们相乘时,您在 [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 很可能不会做你希望的事情,但你必须告诉我们那是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多