Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Bug HumanPoseHandler.GetInternalAvatarPose not work, maybe its a bug

Discussion in 'Editor & General Support' started by sp958857, Aug 13, 2022.

  1. sp958857

    sp958857

    Joined:
    Jun 1, 2016
    Posts:
    5
  2. sp958857

    sp958857

    Joined:
    Jun 1, 2016
    Posts:
    5
    ps: version 2021.3.6f1
     
  3. sp958857

    sp958857

    Joined:
    Jun 1, 2016
    Posts:
    5
    the test code like this below:
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using Unity.Collections;
    4. using UnityEngine;
    5.  
    6. public class HumanPoseHandlerTest : MonoBehaviour
    7. {
    8.     public Animator input;
    9.     public Animator ouput;
    10.    
    11.     private HumanPoseHandler inputPoseHandler;
    12.     private HumanPoseHandler thisPoseHandler;
    13.    
    14.     private NativeArray<float> inputPoseArray;
    15.     private NativeArray<float> thisPoseArray;
    16.  
    17.     private List<string> inputJointPaths;
    18.     private List<Transform> inputAvatarTransforms;
    19.     private List<string> thisJointPaths;
    20.     private List<Transform> thisAvatarTransforms;
    21.     void Start()
    22.     {
    23.         var inputAnimator = input;
    24.         inputJointPaths       = new List<string>();
    25.         inputAvatarTransforms = new List<Transform>();
    26.         ParseAvatarRootTransform(inputAnimator.transform, inputJointPaths, inputAvatarTransforms);
    27.         inputPoseHandler = new HumanPoseHandler(inputAnimator.avatar, inputJointPaths.ToArray());
    28.         inputPoseArray   = new NativeArray<float>(inputJointPaths.Count * 7, Allocator.Persistent);
    29.         inputPoseHandler.GetInternalAvatarPose(inputPoseArray);
    30.        
    31.         var thisAnimator = ouput;
    32.         thisJointPaths       = new List<string>();
    33.         thisAvatarTransforms = new List<Transform>();
    34.         ParseAvatarRootTransform(thisAnimator.transform, thisJointPaths, thisAvatarTransforms);
    35.         thisPoseHandler = new HumanPoseHandler(thisAnimator.avatar, thisJointPaths.ToArray());
    36.         thisPoseArray   = new NativeArray<float>(thisJointPaths.Count * 7, Allocator.Persistent);
    37.     }
    38.  
    39.     void ParseAvatarTransformRecursive(Transform t, string parentPath, List<string> jointPaths, List<Transform> transforms)
    40.     {
    41.         string jointPath = parentPath.Length == 0 ? t.gameObject.name : parentPath + "/" + t.gameObject.name;
    42.         jointPaths.Add(jointPath);
    43.         transforms.Add(t);
    44.  
    45.         foreach (Transform child in t)
    46.         {
    47.             ParseAvatarTransformRecursive(child, jointPath, jointPaths, transforms);
    48.         }
    49.     }
    50.  
    51.     void ParseAvatarRootTransform(Transform rootTransform, List<string> jointPaths, List<Transform> transforms)
    52.     {
    53.         jointPaths.Add(""); // root tranform path is the empty string
    54.         transforms.Add(rootTransform);
    55.  
    56.         foreach (Transform t in rootTransform)
    57.         {
    58.             ParseAvatarTransformRecursive(t, "", jointPaths, transforms);
    59.         }
    60.     }
    61.    
    62.    
    63.     void Update()
    64.     {
    65.         // for (int i = 0; i < inputAvatarTransforms.Count; ++i)
    66.         // {
    67.         //     Vector3    position = inputAvatarTransforms[i].localPosition;
    68.         //     Quaternion rotation = inputAvatarTransforms[i].localRotation;
    69.         //     thisPoseArray[7 * i]     = position.x;
    70.         //     thisPoseArray[7 * i + 1] = position.y;
    71.         //     thisPoseArray[7 * i + 2] = position.z;
    72.         //     thisPoseArray[7 * i + 3] = rotation.x;
    73.         //     thisPoseArray[7 * i + 4] = rotation.y;
    74.         //     thisPoseArray[7 * i + 5] = rotation.z;
    75.         //     thisPoseArray[7 * i + 6] = rotation.w;
    76.         // }
    77.         inputPoseHandler.GetInternalAvatarPose(inputPoseArray);
    78.         thisPoseHandler.SetInternalAvatarPose(inputPoseArray);
    79.     }
    80. }
    81.  
     
  4. FrenchToastFella

    FrenchToastFella

    Joined:
    Dec 9, 2013
    Posts:
    7
    Did you ever solve this? I'm trying to read pose from one avatar and apply it to another but I can't get it to work.