计算两个四元数之间的旋转增量(作为另一个四元数)

Calculating rotation delta between two quaternions (as another quaterion)

我有一些由四元数表示的初始旋转 r0 和一些实际旋转 r(也是四元数)。我想得到代表旋转增量的四元数。

例如如果 r0 代表 30st OX 旋转并且 r50st OX,则 rDelta 应该包含代表 20st OX 旋转的四元数。

如何计算rDelta?

我的猜测是:

rDelta = r0.getConjugated() * r

rDelta = r.getConjugated() * r0

?但也许 none 个。

你的四元数q(R2/R1)代表R2的旋转w.r.t。 R1

你的四元数q(R3/R1)代表R3的旋转w.r.t。 R1

您想要R3的旋转w.r.t。 R2

q(R3/R2) = q(R3/R1) * q(R1/R2) = q(R3/R1) * conjugate(q(R2/R1)) 其中*是四元数的乘积

所以您想在 rx * r0 == r1 中找到 rx?

rx * r0 * conj(r0) == r1 * conj(r0)
rx == r1 * conj(r0)

您只需要知道围绕 q = q2 * q1 旋转相当于先围绕 q1 旋转,然后再围绕 q2 旋转。如果您想从初始轮换 r0 转到最终轮换 r1,您只需替换:r1 = rx * r0 其中 rxr0r1.

这取决于您的 rDelta 将如何应用(从右或左)

1)r = r0 * rDelta; r = r0 * conj(r0) * r; rDelta == conj(r0) * r;

2)r = rDelta * r0; r = r * conj(r0) * r0; rDelta == r * conj(r0);

我可能是错的,但如果我没记错的话,假设您在 Unity 中并按 Right-to-Left 顺序应用 Q(因为它是 left-handed?),那么为了获得“来自“Q1”到“Q2”,您首先反转 Q1,然后将 Q2 应用于其结果,然后得到增量。您需要从 Q1 轮换多少才能到达 Q2..

    Quaternion r0 = Quaternion.Euler(10, 0, 0);
    Quaternion r = Quaternion.Euler(20, 0, 0);
    Quaternion rDelta = r * Quaternion.Inverse(r0);

哎呀,我什至不知道四元数共轭是什么!我认为对于齐次矩阵,它们与逆矩阵相同吗?是的,刚刚查了一下。

这里也有回答:https://gamedev.stackexchange.com/questions/143430/relative-quaternion-rotation-delta-rotation-produces-unstable-results