合并3个以上的旋转(四元数)

时间:2019-02-15 14:53:28

标签: c# unity3d quaternions euler-angles

我有一个3D点,并且该点有 x,y,z旋转qInitial)。 我想绕着 y 轴(qYextra(<{> 1 )进一步旋转该点(更多)(在某些程度上可能是0,直到360)。 如何计算最终的欧拉旋转qResult.eulerAngles这是这四个旋转(x-y-z-y)的组合

我尝试计算初始四元数旋转以及要应用的额外旋转。然后将这两个四元数相乘。但是,我得到了奇怪的结果(可能是万向节锁)

C#中的代码。团结。

1。Quaternion qX = Quaternion.AngleAxis(rotationFromBvh.x,Vector3.right);

2。Quaternion qY = Quaternion.AngleAxis(rotationFromBvh.y,Vector3.up);

3。Quaternion qZ = Quaternion.AngleAxis(rotationFromBvh.z,Vector3.forward);

4。Quaternion qYextra = Quaternion.AngleAxis(angle,Vector3.up);

Quaternion qInitial = qY * qX * qZ; // Yes. This is the correct order.

  

qY*qX*qZ 与Euler x,y,z结果完全相同   Quaternion.Euler(rotationFromBvh)

Quaternion qResult = qInitial * qYextra;

return qResult.eulerAngles;

我可以确认,当第4旋转为0度时,代码工作正常(无万向节锁定)(qYextra = identity) 。表示qInitial是正确的。因此,该错误可能是由于这两个旋转的组合qInitialqYextra OR 或由于从四元数到Euler

示例:({qYextra角度为120度)

结果:

qInitial.eulerAngles给出以下结果:applying_qInitial_rotation

qResult.eulerAngles给出以下结果:applying_qResult_rotation

预期结果:

预期结果应类似于qInitial,但围绕y旋转120度。

有什么建议吗?我尚未找到解决方案,也许我不会。

1 个答案:

答案 0 :(得分:0)

在您的问题中,您写道:

  

如何计算这四个旋转(x-y-z-y)的最终欧拉旋转?

但是,您在代码中编写了

Quaternion qInitial = qY * qX * qZ; // Multiply them in the correct order.

我不知道统一性,但是我希望您希望旋转的顺序匹配x,y,z,而不是y,x,z。

您说过,当y旋转为0时有效,在这种情况下y旋转的顺序无关紧要。

如果您改写下面的代码,您得到正确的结果吗?

Quaternion qInitial = qX * qY * qZ; // Multiply them in the correct order.