结合超过3个旋转(四元数)

问题描述 投票:1回答:1

我有一个3D点和那个点的x,y,z旋转(qInitial)。我想围绕y轴(qYextra)将该点旋转更多(通过某种程度可以是0到360)。如何计算最终的欧拉旋转(qResult.eulerAngles),它是这4个旋转(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*qZQuaternion.Euler(rotationFromBvh)具有完全相同的Euler x,y,z结果

Quaternion qResult = qInitial * qYextra;

return qResult.eulerAngles;

当第4次旋转为0度(qYextra = identity)时,我可以确认代码工作正常(没有万向节锁定)。意思是qInitial是正确的。因此,错误可能是由于这两个旋转(qInitialqYextra)的组合或由于从四元数到欧拉的转换。

示例:(qYextra角度为120度)

结果:

qInitial.eulerAngles给出了这些结果:applying_qInitial_rotation

qResult.eulerAngles给出了这些结果:applying_qResult_rotation

预期成绩:

预期的结果应该像qInitial,但围绕y旋转120度。

有什么建议?我还没有找到解决方案,可能我不会。

c# unity3d quaternions euler-angles
1个回答
0
投票

在你的问题中,你写道:

如何计算这4个旋转(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.
© www.soinside.com 2019 - 2024. All rights reserved.