方向偏移

时间:2016-01-20 12:33:31

标签: unity3d

我正在使用MVN-Unity plug-in来访问Xsens动作捕捉数据并实时制作Unity角色动画。白色和绿色和黄色的角色是一个Unity骨架,它基于Xsens运动数据进行动画制作。

我现在正试图使用​​Xsens(看起来像人类的另一个角色)动画一个不同的(非Unity)角色,这与插件的作用类似,运动数据(位置和方向)正在映射到他的关节/骨骼。

但是正如你在下面看到的那样,方向有问题......

enter image description here

我认为原因可能是MVN的轮换没有被正确抵消。正如你在接下来的两张照片中看到的那样,MVN臀部的x轴(红色)指向木偶的背面,而对于男士的臀部,x轴指向他的右侧。

enter image description here

enter image description here

也可能是插件在应该使用本地旋转的地方使用全局旋转。当我在启动Unity应用程序之前旋转那个人时,可以证明这种情况;即选择该家伙的根游戏对象,并在按下播放前尝试将y旋转设置为0/90/180/270,并比较结果:每次失真都不同。

我不知道如何正确解决这个问题。更新Unity模型(映射到MVN木偶或人)的代码片段如下。我从插件脚本中获取了这个:

private void updateModel(Transform[] pose, Transform[] model)
        {
            // Re-set the target, then set it up based on the segments.
            Vector3 pelvisPos = new Vector3();
            Vector3 lastPos = target.position;
            target.position = Vector3.zero;

            // Map only 23 joints.
            for (int i = 0; i < 23; i++)
            {
                switch (i)
                {                        
                    // Position only on y axis, and leave x and z to the body. Apply the 'global' position & orientation to the pelvis.
                    case (int)XsAnimationSegment.Pelvis:                        
                        pelvisPos = pose[i].position * scale;
                        model[i].position = new Vector3( model[i].position.x, pelvisPos.y, model[i].position.z );                        
                        model[i].rotation = pose[i].rotation * modelRotTP[i];
                        break;                            

                    // Update only the 'orientation' for the rest of the segments.
                    default:                        
                        if ( model[i] != null )
                        {
                            model[i].rotation = pose[i].rotation * modelRotTP[i];
                        }
                        break;
                }
            }

            // Apply root motion if the flag is enabled; i.e. true.
            if (applyRootMotion)
            {
                // Only update x and z, since pelvis is already modified by y previously.
                target.position = new Vector3(pelvisPos.x + pelvisPosTP.x, lastPos.y, pelvisPos.z + pelvisPosTP.z);
            }

            // Set the final rotation of the full body, but only position it to face similar as the pelvis.
            Quaternion q = Quaternion.Inverse(modelRotTP[(int)XsAnimationSegment.Pelvis]) * model[(int)XsAnimationSegment.Pelvis].rotation;
            target.rotation = new Quaternion(target.rotation.x, q.y, target.rotation.z, target.rotation.w);
        }

我理解代码的作用,但我不知道如何解决这个问题。最有可能与轴不同?我很感激任何帮助...

1 个答案:

答案 0 :(得分:1)

您可以在以下行中修改XsLiveAnimator.cs脚本:496 那个

model [segmentOrder [i]] .transition.rotation = orientation [segmentOrder [i]]; model [segmentOrder [i]]。transform.Rotate(rotOffset,Space.World);

rotOffset是轮换的Vector3