即使你不熟悉的BVH文件格式,也许你可以帮我如何两个旋转结合起来。
我只是把根自转从BVH(复制X,Y,Z值)文件根的渠道设置是这样的:
CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
我想通过一些度旋转根可以是0到360,围绕y轴(0,1,0)。这种旋转工作在某些帧。然而,在大多数帧中,根奇怪旋转(它像一个万向节锁定已经发生)。
这是我使用的代码。 C#中的统一。我只是想正确地运用围绕y轴的根部的旋转。
我可以确认代码工作正常(正确BVH动画)加入0度围绕y轴旋转时。所以,误差必须在这些2个旋转(qBefore和YawRotationQuaternion)的组合。
private Vector3 getFinalRootRotation(Vector3 rotationFromBvh, float angle)
{
// [INITIALIZE]: Convert Euler to Quaternion for each axis.
Quaternion qX = Quaternion.AngleAxis(rotationFromBvh.x, Vector3.right);
Quaternion qY = Quaternion.AngleAxis(rotationFromBvh.y, Vector3.up);
Quaternion qZ = Quaternion.AngleAxis(rotationFromBvh.z, Vector3.forward);
Quaternion qBefore = qY * qX * qZ; // Multiply them in the correct order.
// Order in BVH file is ZXY.
qazxsw POI具有完全相同的欧拉X,Y,Z的结果qazxsw POI
qY*qX*qZ
我的目标是创建一个具有新的根自转新BVH。这是我写在文件中的新的旋转代码的一部分。此代码进行测试并创建一个BVH文件就OK了。
Quaternion.Euler(rotationFromBvh)
I'ld说,你得到的BVH值的顺序 // [CREATE ROTATION AROUND Y]: Get the quaternion of rotating around y axis.
Quaternion YawRotationQuaternion = Quaternion.AngleAxis(angle, Vector3.up);
// [APPLY ROTATION AROUND Y]
Quaternion qAfter = qBefore * YawRotationQuaternion;
// [RETURN IN XYZ FORM]
return qAfter.eulerAngles;
}
一个很好的理由。
从private string CreateMLine(Vector3 rootPosition, Vector3 rootRotation, List<Vector3> rotations)
{
StringBuilder s = new StringBuilder();
// Apply root's translation and rotation.
s.Append(rootPosition.x + " " + rootPosition.y + " " + rootPosition.z + " ");
s.Append(rootRotation.z + " " + rootRotation.x + " " + rootRotation.y + " ");
for(int i=1; i<rotations.Count; i++) // start at 1 ==> skip rotation of the root.
{
s.Append(rotations[i].z + " " + rotations[i].x + " " + rotations[i].y + " ");
}
s.Append("\n");
return s.ToString();
}
:
该旋转绕z轴euler.z度,绕x轴euler.x度,euler.y度绕y轴(以该顺序)的旋转。
所以我认为错误在于,
Zrotation Xrotation Yrotation
它使用一个不正确的顺序。
它应该是
Quaternion.eulerAngles
I'ld建议使用Quaternion qBefore = qY * qX * qZ;
代替
返回的旋转进行旋转绕z轴z度,X围绕y轴绕x轴度,和y度。
Quaternion qBefore = qZ * qX * qY;