我有一个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
是正确的。因此,该错误可能是由于这两个旋转的组合(qInitial
和qYextra
) OR 或由于从四元数到Euler 。
示例:({qYextra
角度为120度)
结果:
qInitial.eulerAngles
给出以下结果:applying_qInitial_rotation
qResult.eulerAngles
给出以下结果:applying_qResult_rotation
预期结果:
预期结果应类似于qInitial
,但围绕y旋转120度。
有什么建议吗?我尚未找到解决方案,也许我不会。
答案 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.