【问题标题】:How to get opposite angle quaternion如何获得对角四元数
【发布时间】:2023-04-01 16:00:01
【问题描述】:

我正在计算 2 个四元数之间的四元数旋转。

我知道 Q1 = r x Q2,所以我认为 r = Q1 x Q2* (星号表示共轭)

然而,这似乎给了我我需要的相反的角度。

例如。如果 Q1 和 Q2 关闭 Pi/2,我将得到 -Pi/2 的四元数。我怎样才能得到我需要的正确角度?

示例: 我从前方向左看 45 度。我正在推动世界前进。相对于外观,我向右移动 45 度。在这种情况下,我需要 r 旋转 45 度。

提前谢谢你

【问题讨论】:

  • 你的公式是正确的。您可能以错误的顺序应用四元数。
  • @Sneftel 四元数相乘的顺序似乎没有区别。我尝试改变哪一个是共轭的,但这根本不起作用。
  • 您能否举例说明 Q1 和 Q2 没有产生您预期的结果?
  • 四元数是 XNA 游戏中的世界空间和视图空间。我使用 q1 作为 (0,0,0,1) 和 q2 作为 (-.3761814, .2987422, .05993626, .8750133) 我得到的结果是 (.3761814, -.2987422, -.05993626, .8750133 ) 我正在共轭 q2。抱歉修改
  • 这些结果是正确的。应用该结果,然后是 Q2,将产生 Q1。

标签: quaternions


【解决方案1】:

问题的描述对我来说不是很清楚。我认为最好推导出您找到的公式。希望这能让您理解(并想象)为什么您可能会得到您现在的结果。

给定两个四元数 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)

现在,已经找到了角度和轴,您应该能够可视化旋转。

最后,附带说明一下,Hamilton 乘积 (*) 不可交换。这意味着(Q1*) * Q2 不一定等于Q2 * (Q1*)。同上推导,从 Q2 到 Q1 的相对单位四元数旋转可以计算为:

relativeRotation = (Q2*) * Q1

【讨论】:

  • Qr = (Q1*) * Q2 似乎暗示旋转方程是 Q2 = Q1 * Qr,但正如 OP 所提到的,他们正在使用(更常见的?)旋转方程:Q2 = Qr * Q1。在这种情况下,相对旋转方程不应该是Qr = Q2 * (Q1*)吗?这不是 OP 得到相反结果的原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2018-06-20
  • 2018-11-18
  • 2019-11-23
相关资源
最近更新 更多