我有一个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*qZ
与Quaternion.Euler(rotationFromBvh)
具有完全相同的Euler x,y,z结果
Quaternion qResult = qInitial * qYextra;
return qResult.eulerAngles;
当第4次旋转为0度(qYextra = identity
)时,我可以确认代码工作正常(没有万向节锁定)。意思是qInitial
是正确的。因此,错误可能是由于这两个旋转(qInitial
和qYextra
)的组合或由于从四元数到欧拉的转换。
示例:(qYextra
角度为120度)
结果:
qInitial.eulerAngles
给出了这些结果:applying_qInitial_rotation
qResult.eulerAngles
给出了这些结果:applying_qResult_rotation
预期成绩:
预期的结果应该像qInitial
,但围绕y旋转120度。
有什么建议?我还没有找到解决方案,可能我不会。
在你的问题中,你写道:
如何计算这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.