c - slerp 的输出四元数到底是什么?

标签 c math vector quaternions

我正在尝试实现 SLERP(由 Ken Shoemake 在“使用四元数曲线动画旋转”中描述) 我已经在维基百科(主题:四元数, 12 )和其他网站上阅读了该主题,并在 stackoverflow 上搜索了有关此问题的信息。看来我理解其背后的理论,但监督一个小细节。我将使用 w 作为四元数的标量值

所以最初我有两个 3D vector 。每个 vector 都有两个坐标系(C 和 C')的表示。我的目标是在系统中找到这些 vector 的第三个表示,位于最初两个 vector 的“中间”。 所以我所做的就是找到旋转矩阵,它将 vector 从 C 转换为 C',这似乎效果很好。 我的下一步是将这个矩阵转换为四元数,这也是可行的。

现在我的问题是 slerp 的公式,即:

slerp(q1, q2; u) = ((sin(1-u) * t)/(sin t)) * q1 + (sin(ut)/sin t) * q2

(抱歉,尚无法上传图片以获得更好的展示效果:请参阅来源 1)

所以我猜这里 u = 0.5,q1 是我想要旋转的 vector (w=0),q2 等于我之前计算的四元数。 Theta 是根据归一化 vector 和(已经)归一化四元数的点积计算的。

所以我期望的是我得到一个 vector ,从 C 旋转到第三坐标系或从 C' 旋转到第三坐标系。

我现在的问题是,我不明白如何获得 vector 而不是四元数。意思是,我怎么可能得到一个 (w=0) 的四元数,因为简单地将 q2 与这个因子相乘不会将 w 设置为 0。或者我会从这个函数中得到其他东西吗?

我在这里监督什么?

感谢您的帮助!

最佳答案

看来我已经明白了。对于有同样理解问题的人:

slerp 只是在两个方向之间进行插值,即在两个实际旋转之间进行插值。所以在我的例子中,q1 是对应于单位矩阵的四元数(因此 [1, 0, 0, 0])。 q2 是旋转。 θ 仍然是 0.5。 使用从中得到的四元数,我必须用 q^-1 v q 计算旋转。其中 v 是我想要旋转的 vector 。这可以使用汉密尔顿乘积来计算。

关于c - slerp 的输出四元数到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20032082/

相关文章:

c++ - 使用 gnu 缩进如何将 int * 变为 int*

python - 无法找到数字 1-20 的最小公倍数

regex - R - 拆分字符向量,以便将每个唯一元素添加到新的字符向量

ios - C/Objective C 中奇怪的 return 语句

c - 将枚举值切换为位标志

loops - FOR/NEXT 带有多个下一个命令

python - number为正负(包括0)如何返回1或-1?

r - 将 vector1 中的每个元素与 vector2 中的每个元素进行比较的矩阵

c++ - 在基于范围的 for 循环中从 std::vector<Object> 获取指向对象的指针

c - 当我尝试读取动态分配的数组内容时,为什么我的 C 代码会出现 "segmentation fault"错误?