Большинство 3D-анимаций проигрываются путем поворота костей скелета по заданным значениям (ключам). Позиции дочерних костей определяются позициями родительских. Этот метод управления скелетом называется прямая кинематика.
Однако, часто бывает полезно взглянуть на задачу с другой стороны. Можно работать в обратном направлении и задавать позиции родительских костей в зависимости от положения дочерних. Это очень удобно, когда вы хотите, чтобы персонаж касался выбранных игроком объектов или реалистично ходил по неровной поверхности. Этот метод называется Инверсная Кинематика (IK) и доступен в Mecanim для любого человекоподобного персонажа с правильно настроенным скелетом.
Чтобы использовать IK вам нужно разместить на сцене объекты, с которыми ваш персонаж будет взаимодействовать, а затем настроить IK через скрипт, использующий специальные функции для IK-анимации: SetIKPositionWeight, SetIKRotationWeight, SetIKPosition, SetIKRotation, SetLookAtPosition, bodyPosition, bodyRotation.
На картинке выше видно, что персонаж держит в руках цилиндр. Как это сделать?
Нужно разместить на сцене персонажа с настроенным скелетом и добавить к нему скрипт, который будет управлять IK. Назовем его IKCtrl.
Код
using UnityEngine; using System; using System.Collections;
[RequireComponent(typeof(Animator))]
public class IKCtrl : MonoBehaviour {
protected Animator animator;
public bool ikActive = false; public Transform rightHandObj = null;
//Возвращаемся к IK void OnAnimatorIK() { if(animator) {
//Если IK включен, то направляем правую руку к цели if(ikActive) {
//weight = 1.0 означает, что правая рука будет стремиться к цели с максимальным приоритетом. animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1.0f); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1.0f);
//Если IK не активен, тогда стремиться к оригинальной позиции. else { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0); } } } }
Создайте цилиндр и разместите его на сцене так, как вам нужно. Далее переместите его из инспектора в "Right Hand Obj" скрипта IKCtrl.
Запустите игру и посмотрите, как персонаж берет и отпускает цилиндр при включении и выключении ikActive.
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Unity - Инверсная Кинематика (Pro-версия)», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
C Mecanim не имел толком дела, пользуюсь стандартной анимацией, скажите, а вот надо сделать чтобы персонаж ставил ноги на землю (когда идёт по ступенькам, например, чтобы ноги не проваливались), намного сложнее это сделать? И как это отразится на производительности, если персонажей много?