gpt4 book ai didi

c++ - 在两个四元数之间插值很长

转载 作者:行者123 更新时间:2023-12-01 13:40:39 25 4
gpt4 key购买 nike

我们可以像这样在两个四元数之间进行 slerp 插值:

quat slerp(quat q1, quat q2, float t) {
float angle = acos(dotProduct(q1, q2));
float denom = sin(angle);
//check if denom is zero
return (q1*sin((1-t)*angle)+q2*sin(t*angle))/denom;
}
这将以最短的方式在两个四元数之间进行插值。然而,在四元数之间进行插值还有很长的路要走。如下图所示(来源 Maya)。
enter image description here
我们如何插值很长的路?

最佳答案

单位四元数的性质以及它们映射到 3D 旋转的方式意味着它们可以用两种方式描述每个 3D 旋转值 - 如 q(r, v')并作为 q(-r, -v') (将它们想象为轴角旋转 - 反转轴和角度会导致相同的 3D 旋转)。
四元数实际上是 4D 单位球面上的点,这两个值代表该球面上的对映点。
对于两个四元数的 slerp(或 nlerp)要遵循最短路径,相应的 4D 点必须位于 4D 球体的同一个半球上(这也是为什么超过 2 个四元数的加权平均值没有一个独特的解决方案)。这映射到非负点积,并且通常在插值代码中进行测试。
简单地否定源四元数之一会给你一个“在 4D 球体的另一侧”的点,并导致“很长的路要走”的插值(并解释为什么否定插值参数会导致相同的结果)。

关于c++ - 在两个四元数之间插值很长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62943083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com