我正在计算2个四元数之间的四元数旋转。
我知道Q1 = r x Q2,所以我认为r = Q1 x Q2 * (星号表示共轭)
然而,这似乎让我与我需要的角度相反。离。如果Q1和Q2是Pi / 2关闭,我将得到-Pi / 2的四元数。我怎样才能得到我需要的正确角度?
实施例: 我正向前看45度。我正在推动世界前进。相对于外观,我向右行驶45度。在这种情况下,我需要r正好旋转45度。
提前谢谢
答案 0 :(得分:2)
对我来说,问题的描述并不十分清楚。我认为最好得出你找到的公式。希望这可以让您理解(并可视化)您可能获得结果的原因。
给定两个四元数Q1和Q2,相对四元数旋转从Q1到Q2 :
Quaternion = relativeRotation = Q1^(-1) * Q2
其中Q1^(-1)
表示Q1的倒数。您可以将此视为应用Q1到Q2的相反旋转。结果将是两者之间的相对旋转。四元数的倒数可以通过以下公式计算:
Q^(-1) = (Q*) / ||Q||^2
Q*
表示Q
的共轭。我假设您已经知道如何找到四元数的共轭。现在,如果Q
是单位四元数,那么Q
范数的范数和平方都是1.0。因此,我们有:
Q^(-1) = Q*
这简化了我们的公式:
Quaternion relativeRotation = (Q1*) * Q2
请注意,只有单位四元数表示旋转。但是,由于两个单位四元数的Hamilton积本身就是一个单位四元数,我们不需要对结果进行归一化。
现在,从这个相对四元数,你可以确定角度(以弧度表示):
float angle = 2.0f * acos(relativeRotation.w)
这里,w
是四元数的标量分量,acos
是反余弦三角函数。该角度约为轴:
Vector3 axis = (relativeRotation.x, relativeRotation.y, relativeRotation.z)
现在,找到了角度和轴,您应该能够看到旋转。
最后,作为附注,汉密尔顿产品(*)不是可交换的。这意味着(Q1*) * Q2
不一定等于Q2 * (Q1*)
。按照与上述相同的推导,从Q2到Q1的相对单位四元数旋转可以通过以下公式计算:
relativeRotation = (Q2*) * Q1