计算两个四元数之间的旋转增量(作为另一个四元数)
Calculating rotation delta between two quaternions (as another quaterion)
我有一些由四元数表示的初始旋转 r0
和一些实际旋转 r
(也是四元数)。我想得到代表旋转增量的四元数。
例如如果 r0
代表 30st OX
旋转并且 r
是 50st 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
其中 rx
是 r0
和 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 中并按 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);
哎呀,我什至不知道四元数共轭是什么!我认为对于齐次矩阵,它们与逆矩阵相同吗?是的,刚刚查了一下。
我有一些由四元数表示的初始旋转 r0
和一些实际旋转 r
(也是四元数)。我想得到代表旋转增量的四元数。
例如如果 r0
代表 30st OX
旋转并且 r
是 50st 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
其中 rx
是 r0
和 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 中并按 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);
哎呀,我什至不知道四元数共轭是什么!我认为对于齐次矩阵,它们与逆矩阵相同吗?是的,刚刚查了一下。