我有一些由四元数表示的初始旋转r0
和一些实际旋转r
(也是一个四元数)。我想得到表示旋转增量的四元数。
例如,如果r0
代表30st OX
旋转,而r
是50st OX
,则rDelta
应包含表示20st OX
旋转的四元数。
如何计算rDelta
我的猜测是:
rDelta = r0.getConjugated() * r
或
rDelta = r.getConjugated() * r0
但也许这些都没有。
所以您想在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
,其中rx
是r0
和r1
之间缺少的步骤。
四元数q(R2/R1)
表示R2相对于R1 的旋转
四元数q(R3/R1)
表示R3相对于R1 的旋转
您希望R3相对于R2 进行轮换
即q(R3/R2) = q(R3/R1) * q(R1/R2) = q(R3/R1) * conjugate(q(R2/R1))
,其中*是四元数的乘积
这取决于如何应用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中,并按从右到左的顺序应用Q(因为它是左撇子?),那么为了得到"从";Q1";至";Q2,你首先求Q1的倒数,然后将Q2应用于它的结果,这就得到了delta。从第一季度到第二季度需要轮换多少。
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