Объявление
public HumanPoseHandler(Avatar avatar, Transform root);public HumanPoseHandler(Avatar avatar, string[] jointPaths);
Параметры
avatar | Аватар, с которого HumanPose будет читаться или записываться. Аватар должен быть гуманоидом. |
root | Самый верхний родитель иерархии скелетов, определенный в человекоподобном avatar . Это должно соответствовать определению avatar . |
jointPaths | Список, определяющий пути соединения avatar . Каждый объединенный путь начинается с узла после корневого преобразования и продолжается вниз по иерархии скелета аватара. Путь соединения корневого преобразования представляет собой пустую строку. |
Описание
Создает обработчик позы человека из avatar
и преобразования root
, а также либо из списка путей соединения.
Укажите avatar
и преобразование root
, чтобы создать позу человека из иерархии скелетов (аватар). Укажите avatar
и список путей соединения, чтобы создать обработчик позы человека, который не привязан к иерархии преобразования скелета. Вы можете использовать обработчик позы человека, созданный из путей суставов, для преобразования позы человека в или из массива локальных преобразований суставов (jointPaths).
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Unity.Collections;
public class ExampleClass : MonoBehaviour
{
public Avatar avatar;
public Transform avatarRoot;
void ParseAvatarTransformRecursive(Transform t, string parentPath, List jointPaths, List<Transform> transforms)
{
string jointPath = parentPath.Length == 0 ? t.gameObject.name : parentPath + "/" + t.gameObject.name;
jointPaths.Add(jointPath);
transforms.Add(t);
foreach (Transform child in t)
{
ParseAvatarTransformRecursive(t, jointPath, jointPaths, transforms);
}
}
void ParseAvatarRootTransform(Transform rootTransform, List jointPaths, List<Transform> transforms)
{
jointPaths.Add(""); // root tranform path is the empty string
transforms.Add(rootTransform);
foreach (Transform t in rootTransform)
{
ParseAvatarTransformRecursive(t, "", jointPaths, transforms);
}
}
void Start()
{
List jointPaths = new List();
List<Transform> avatarTransforms = new List<Transform>();
ParseAvatarRootTransform(avatarRoot, jointPaths, avatarTransforms);
HumanPoseHandler humanPoseHandler = new HumanPoseHandler(avatar, jointPaths.ToArray());
NativeArray avatarPose = new NativeArray(jointPaths.Count * 7, Allocator.Persistent);
for (int i = 0; i < jointPaths.Count; ++i)
{
Vector3 position = avatarTransforms[i].localPosition;
Quaternion rotation = avatarTransforms[i].localRotation;
avatarPose[7 * i] = position.x;
avatarPose[7 * i + 1] = position.y;
avatarPose[7 * i + 2] = position.z;
avatarPose[7 * i + 3] = rotation.x;
avatarPose[7 * i + 4] = rotation.y;
avatarPose[7 * i + 5] = rotation.z;
avatarPose[7 * i + 6] = rotation.w;
}
humanPoseHandler.SetInternalAvatarPose(avatarPose);
avatarPose.Dispose();
humanPoseHandler.Dispose();
}
}
В приведенном выше примере создается обработчик позы человека из аватара и списка суставов аватара. В примере поза считывается из корневого преобразования аватара и записывается в обработчик позы человека.