Обратная кинематика
Большая часть анимации персонажа создается путем поворота углов сочленений в скелет до заранее определенных значений. Положение дочернего сочленения изменяется в зависимости от вращения родительского. Конечная точка цепи сочленений определяется углами и относительными положениями отдельных сочленений вдоль цепи. Этот метод позиционирования скелета известен как кинематическая передняя.
Тем не менее, часто полезно позиционировать суставы с противоположной точки зрения. Начните с выбранного положения в пространстве или цели и работайте назад, чтобы найти способ ориентировать суставы так, чтобы конечная точка достигала цели. Это может быть полезно, если вы хотите, чтобы персонаж схватил объект или стоял на неровной поверхности. Этот подход известен как обратная кинематика (IK). Он поддерживается в Mecanim для гуманоидного персонажа с правильно настроенным Аватаром.
Чтобы настроить IK для персонажа, обычно вокруг сцены, с которой взаимодействует персонаж, есть объекты. Вы можете использовать эти объекты и своего персонажа для настройки IK в сценарии. Вы можете использовать следующие функции Animator:
- SetIKPositionWeight
- SetIKRotationWeight
- SetIKPosition
- SetIKRotation
- SetLookAtPosition
- bodyPosition
- bodyRotation
Например, на изображении выше показан символ, прикасающийся к цилиндрическому объекту. Чтобы сделать это с помощью IK и с помощью скрипта, выполните следующие действия:
Создайте допустимый Аватар для вашего персонажа.
Создайте Animator Контроллер с хотя бы одной анимацией для этого персонажа.
-
В панели Слои окна Animator нажмите на значок шестерни в слое Базовый слой и включите IK Pass из контекстного меню. Когда это включено, IK Pass отправляет обратный вызов
OnAnimatorIK. На более позднем этапе вы будете использовать этот обратный вызов для реализации обратной кинематики в скрипте.
Установите флажок IK Pass для слоя по умолчанию. -
Убедитесь, что Контроллер Animator назначен Контроллеру Animator персонажа.
Компонент контроллера Animator, назначенный контроллеру персонажа Animator. -
Далее, добавьте скрипт к вашему персонажу. В этом примере скрипт называется
IKControl. Этот скрипт устанавливает цель IK для правой руки персонажа. Этот скрипт также изменяет взгляд на позицию, так что персонаж смотрит на объект цилиндра при захвате. Полный скрипт перечислен ниже:using UnityEngine; using System; using System.Collections; [RequireComponent(typeof(Animator))] public class IKControl : MonoBehaviour { protected Animator animator; public bool ikActive = false; public Transform rightHandObj = null; public Transform lookObj = null; void Start () { animator = GetComponent<Animator>(); } //a callback for calculating IK void OnAnimatorIK() { if(animator) { //if the IK is active, set the position and rotation directly to the goal. if(ikActive) { // Set the look target position, if one has been assigned if(lookObj != null) { animator.SetLookAtWeight(1); animator.SetLookAtPosition(lookObj.position); } // Set the right hand target position and rotation, if one has been assigned if(rightHandObj != null) { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1); animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position); animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation); } } //if the IK is not active, set the position and rotation of the hand and head back to the original position else { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0); animator.SetLookAtWeight(0); } } } } Чтобы избежать прохождения правой руки через Цилиндр GameObject, добавьте пустой дочерний объект GameObject к
CylinderGameObject. Для этого щелкните правой кнопкой мыши Цилиндр GameObject в окне Hierarchy и выберите Создать пустой. Назовите этот пустой дочерний объект GameObjectCylinder Grab Handle.-
Поместить и повернуть
Cylinder Grab HandleGameObject так, чтобы правая рука касалась цилиндра, но не проходила через него.
Пустое GameObject действует в качестве IK цели. Добавьте это пустое GameObject так, чтобы правая рука взаимодействовала с объектом Цилиндр. Назначьте
Cylinder Grab HandleGameObject в качестве свойства Right Hand Obj скриптаIKControl.-
Назначьте
CylinderGameObject в качестве Look Obj так, чтобы персонаж смотрел в направлении центра Цилиндра, когда IK Active включено.
Компонент IKControl (Script) с назначенными свойствами. Перейдите в режим игры. Ваш персонаж должен прикоснуться и отпустить цилиндр GameObject, как вы включили и отключили флажок IK Active. В режиме игры измените положение и вращение
CylinderGameObject, чтобы посмотреть, как реагирует правая рука и персонаж.