我正在使用MVN-Unity plug-in来访问Xsens动作捕捉数据并实时制作Unity角色动画。白色和绿色和黄色的角色是一个Unity骨架,它基于Xsens运动数据进行动画制作。
我现在正试图使用Xsens(看起来像人类的另一个角色)动画一个不同的(非Unity)角色,这与插件的作用类似,运动数据(位置和方向)正在映射到他的关节/骨骼。
但是正如你在下面看到的那样,方向有问题......
我认为原因可能是MVN的轮换没有被正确抵消。正如你在接下来的两张照片中看到的那样,MVN臀部的x轴(红色)指向木偶的背面,而对于男士的臀部,x轴指向他的右侧。
也可能是插件在应该使用本地旋转的地方使用全局旋转。当我在启动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);
}
我理解代码的作用,但我不知道如何解决这个问题。最有可能与轴不同?我很感激任何帮助...
答案 0 :(得分:1)
您可以在以下行中修改XsLiveAnimator.cs脚本:496 那个
model [segmentOrder [i]] .transition.rotation = orientation [segmentOrder [i]]; model [segmentOrder [i]]。transform.Rotate(rotOffset,Space.World);
rotOffset是轮换的Vector3