由角度绕Y轴的BVH动画的根

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

即使你不熟悉的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)
c# unity3d rotation quaternions
1个回答
0
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.