Unity 6.3
0 онлайн 77 гостей 3 в системе
Вход

HumanPose.ikGoalRotations

Declaration

public ReadOnlySpan<Quaternion> ikGoalRotations;

Описание

Ротация четырех IK целей: левая нога, правая нога, левая рука и правая рука в символьном пространстве.

Используйте в сочетании с HumanPose.bodyRotation для вычисления глобального вращения эффекторов Avatar IK. См. пример кода для подробностей.

using System;
using UnityEngine;

[RequireComponent(typeof(Animator))]
[ExecuteInEditMode]
public class HumanPoseHandlerEffectorDisplay : MonoBehaviour
{
    private Animator m_Animator;
    private HumanPoseHandler m_HumanPoseHandler;
    private HumanPose m_HumanPose;

    void OnEnable()
    {
        m_Animator = GetComponent<Animator>();
        m_HumanPoseHandler = new HumanPoseHandler(m_Animator.avatar, m_Animator.avatarRoot);
        m_HumanPose = new HumanPose();
    }

    private void OnDrawGizmos()
    {
        //Acquire the human pose from the current position of the transforms
        m_HumanPoseHandler.GetHumanPose(ref m_HumanPose);

        //backup the gizmos static color.
        var color = Gizmos.color;
        Gizmos.color = Color.yellow;
        for (int i = 0; i < 4; i++)
        {
            //Acquire the local position and rotation of the effectors
            var localPosition = m_HumanPose.ikGoalPositions[i];
            var localRotation = m_HumanPose.ikGoalRotations[i];

            //Calculate the global position of the effector by rotating by the body rotation, then adding the body position
            var globalPosition = m_HumanPose.bodyRotation * localPosition + m_HumanPose.bodyPosition;

            //Multiply the position by the human scale to convert the normalized position into the global position
            globalPosition *= m_Animator.humanScale;

            //Calculate the global rotation
            var globalRotation = m_HumanPose.bodyRotation * localRotation;

            //Backup the static gizmos matrix
            var backup = Gizmos.matrix;

            //Set the matrix to rotate the sphere to align with the effector
            Gizmos.matrix = Matrix4x4.identity * Matrix4x4.Translate(globalPosition) * Matrix4x4.Rotate(globalRotation) * Matrix4x4.Translate(-globalPosition);

            Gizmos.color = Color.red;
            Gizmos.DrawLine(globalPosition, globalPosition + Vector3.right * 0.2f);
            Gizmos.color = Color.green;
            Gizmos.DrawLine(globalPosition, globalPosition + Vector3.up * 0.2f);
            Gizmos.color = Color.blue;
            Gizmos.DrawLine(globalPosition, globalPosition + Vector3.forward * 0.2f);

            //Draw the sphere
            Gizmos.DrawWireSphere(globalPosition, 0.05f);

            //Restore the static gizmos matrix
            Gizmos.matrix = backup;
        }

        //Restore the gizmos static color
        Gizmos.color = color;
    }
}