Search Unity

HumanPose bodyPosition (center of mass) is drifting away when moving avatar away from origin

Discussion in 'Animation' started by erw29, Mar 25, 2020.

  1. erw29

    erw29

    Joined:
    Sep 27, 2018
    Posts:
    13
    In our application, we are using the human pose of the animator to retarget avatar movements from a source avatar (provided by mocap) to our target avatars. I was wondering that source and target characters are drifting away from each other when leaving the origin of the tracking system.

    So I did some tests with the human pose and found that the bodyPosition (center of mass) provided by the HumanPose does not represent the avatar's position. In the following video, I visualized the actual body pose with red gizmos and the bodyPosition provided by the HumanPose with a green gizmo. You can see that the bodyPosition is drifiting away from the actual avatar position. Is this an intended behavior? Is there a fix for this issue regardless whether it is intended?




    I tested it with the following versions:
    2019.3.0f6
    2019.3.6f1
    2020.1.0b2 (as there seems some progress on human pose)

    And I also tested it with four different characters. The degree of drift and the direction was varying for each.

    Here is the code for my visualization script:

    Code (CSharp):
    1.     public class AvatarPoseVisualizer : MonoBehaviour
    2.     {
    3.  
    4.         public Color32 poseColor;
    5.         public float poseSphereRadius = 0.03f;
    6.         public Color32 comColor;
    7.         public float comSphereRadius = 0.05f;
    8.  
    9.         public Transform rootBone;
    10.         private Animator animator;
    11.         private HumanPoseHandler humanPoseHandler;
    12.         private HumanPose humanPose;
    13.  
    14.         void OnEnable()
    15.         {
    16.             animator = GetComponent<Animator>();
    17.             if (animator == null)
    18.             {
    19.                 Debug.LogError("No animator for visualization found, component was disabled.");
    20.                 enabled = false;
    21.             }
    22.  
    23.             humanPoseHandler = new HumanPoseHandler(animator.avatar, rootBone);
    24.         }
    25.  
    26.         private void OnDrawGizmos()
    27.         {
    28.             if (animator != null)
    29.             {
    30.                 // Draw center of mass
    31.                 Gizmos.color = comColor;
    32.                 humanPoseHandler.GetHumanPose(ref humanPose);
    33.                 Gizmos.DrawSphere(humanPose.bodyPosition, comSphereRadius);
    34.                 Gizmos.color = poseColor;
    35.  
    36.                 // Draw skeleton
    37.                 Gizmos.color = poseColor;
    38.                 var avatarTransforms = new AvatarTransforms();
    39.                 avatarTransforms.headTransform = animator.GetBoneTransform(HumanBodyBones.Head);
    40.                 avatarTransforms.hipsTransform = animator.GetBoneTransform(HumanBodyBones.Hips);
    41.                 avatarTransforms.leftShoulderTransform = animator.GetBoneTransform(HumanBodyBones.LeftShoulder);
    42.                 avatarTransforms.rightShoulderTransform = animator.GetBoneTransform(HumanBodyBones.RightShoulder);
    43.                 avatarTransforms.leftHandTransform = animator.GetBoneTransform(HumanBodyBones.LeftHand);
    44.                 avatarTransforms.rightHandTransform = animator.GetBoneTransform(HumanBodyBones.RightHand);
    45.                 avatarTransforms.leftElbowTransform = animator.GetBoneTransform(HumanBodyBones.LeftLowerArm);
    46.                 avatarTransforms.rightElbowTransform = animator.GetBoneTransform(HumanBodyBones.RightLowerArm);
    47.                 avatarTransforms.pelvisTransform = animator.GetBoneTransform(HumanBodyBones.Hips);
    48.                 avatarTransforms.leftFootTransform = animator.GetBoneTransform(HumanBodyBones.LeftFoot);
    49.                 avatarTransforms.rightFootTransform = animator.GetBoneTransform(HumanBodyBones.RightFoot);
    50.                 avatarTransforms.leftKneeTransform = animator.GetBoneTransform(HumanBodyBones.LeftLowerLeg);
    51.                 avatarTransforms.rightKneeTransform = animator.GetBoneTransform(HumanBodyBones.RightLowerLeg);
    52.                 DrawAvatarSkeletonGizmo(avatarTransforms);
    53.             }
    54.         }
    55.  
    56.         private void DrawAvatarSkeletonGizmo(AvatarTransforms transforms)
    57.         {
    58.             Gizmos.DrawSphere(transforms.pelvisTransform.position, poseSphereRadius);
    59.             Gizmos.DrawSphere(transforms.headTransform.position, poseSphereRadius);
    60.             Gizmos.DrawLine(transforms.pelvisTransform.position, transforms.headTransform.position);
    61.             Gizmos.DrawSphere(transforms.leftShoulderTransform.position, poseSphereRadius);
    62.             Gizmos.DrawSphere(transforms.rightShoulderTransform.position, poseSphereRadius);
    63.             Gizmos.DrawSphere(transforms.rightHandTransform.position, poseSphereRadius);
    64.             Gizmos.DrawSphere(transforms.leftHandTransform.position, poseSphereRadius);
    65.             Gizmos.DrawSphere(transforms.rightHandTransform.position, poseSphereRadius);
    66.             Gizmos.DrawSphere(transforms.leftElbowTransform.position, poseSphereRadius);
    67.             Gizmos.DrawSphere(transforms.rightElbowTransform.position, poseSphereRadius);
    68.             Gizmos.DrawLine(transforms.pelvisTransform.position, transforms.leftShoulderTransform.position);
    69.             Gizmos.DrawLine(transforms.pelvisTransform.position, transforms.rightShoulderTransform.position);
    70.             Gizmos.DrawLine(transforms.leftShoulderTransform.position, transforms.leftElbowTransform.position);
    71.             Gizmos.DrawLine(transforms.rightShoulderTransform.position, transforms.rightElbowTransform.position);
    72.             Gizmos.DrawLine(transforms.leftElbowTransform.position, transforms.leftHandTransform.position);
    73.             Gizmos.DrawLine(transforms.rightElbowTransform.position, transforms.rightHandTransform.position);
    74.             Gizmos.DrawSphere(transforms.leftKneeTransform.position, poseSphereRadius);
    75.             Gizmos.DrawSphere(transforms.rightKneeTransform.position, poseSphereRadius);
    76.             Gizmos.DrawSphere(transforms.leftFootTransform.position, poseSphereRadius);
    77.             Gizmos.DrawSphere(transforms.rightFootTransform.position, poseSphereRadius);
    78.             Gizmos.DrawLine(transforms.pelvisTransform.position, transforms.leftKneeTransform.position);
    79.             Gizmos.DrawLine(transforms.leftKneeTransform.position, transforms.leftFootTransform.position);
    80.             Gizmos.DrawLine(transforms.pelvisTransform.position, transforms.rightKneeTransform.position);
    81.             Gizmos.DrawLine(transforms.rightKneeTransform.position, transforms.rightFootTransform.position);
    82.         }
    83.     }
    Thanks for your help in advance!!
     
    david-mal likes this.
  2. david-mal

    david-mal

    Joined:
    Nov 27, 2017
    Posts:
    6
    Thats very interesting! Have you tried to scale the avatar? How does it behave then?
     
    erw29 likes this.
  3. erw29

    erw29

    Joined:
    Sep 27, 2018
    Posts:
    13
    Scaling of the avatar does not affect the bodyPosition as it seems normalized.
     
  4. kpiosfws

    kpiosfws

    Joined:
    May 30, 2015
    Posts:
    3