user285372
user285372

Reputation:

Orientations Offset

I am using the MVN-Unity plug-in to access Xsens motion capture data and animate a Unity character in real-time. The character in white and green and yellow is a Unity skeleton that is animated based on Xsens motion data.

I am now trying to animate a different (non-Unity) character using Xsens (the other character that looks like a human) so similar to what the plug-in does, the motion data (positions & orientations) are being mapped to his joints/bones.

But as you can see below, something is wrong with orientations...

enter image description here

I think the reason might be that the rotations from MVN are not properly offset. As you can see in the next two pictures, the MVN hips have the x-axis (red) pointing to the puppet's backside, whereas for the guy's hips, the x-axis points to the right of him.

enter image description here

enter image description here

It might also be that the plug-in is using global rotations somewhere where it should use local rotations. That this must be the case can be demonstrated when I rotate the guy around before I start the Unity app; i.e. select the guy's root game object and try setting the y-rotation to 0/90/180/270 before pressing play, and compare the results: every time the distortions are different.

I don't know how to properly fix this. The code snippet that updates the Unity model (mapped to the MVN puppet or the guy) is as follows. I took this from the plug-in scripts:

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);
        }

I sort of understand what the code does, but I don't know how to fix this problem. Most probably to do with the axes being different? I would appreciate any help...

Upvotes: 0

Views: 411

Answers (1)

Roberto Fuchs
Roberto Fuchs

Reputation: 16

You can modify XsLiveAnimator.cs script in the line: 496 with that

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

rotOffset is a Vector3 of your rotation

Upvotes: 0

Related Questions