В этой статье мы рассмотрим, что такое инверсная кинематика для чего она нужна и как ее использовать.
Для начала выясним, что же такое прямая кинематика и что такое инверсная.
Прямая кинематика – это метод изменения позы скелета анимируемого персонажа, применяемый в скелетной анимации, в котором позиция дочернего соединения изменяется согласно повороту родителя, поэтому конечная точка цепочки соединений может быть определена углами и относительными позициями каждого конкретного узла в цепи.
Инверсная кинематика — это метод анимации, которым является поиск набора конфигураций сочленений, который обеспечил бы максимально мягкое, быстрое и точное движение к заданным точкам.
Для чего нам может потребоваться инверсная кинематика? Первое – это для корректного расположения ног персонажа на поверхности. Ну а второе, что мы и рассмотрим, – это положение рук в заданных точках. Например – удержание оружия.
Для этого нам понадобится персонаж с правильно настроенным скелетом, любая анимация и конечно же Unity.
Давайте скачаем и импортируем персонажа и анимацию из Asset store. Я использовал самую первую из найденных в разделе Animation: https://assetstore.unity.com/packages/3d/animations/basic-motions-free-pack-154271
После импорта расположим префаб нашего персонажа в сцене так, что бы его было хорошо видно во вкладке Game. Для этого просто перетащим префаб на сцену и отредактируем его местоположение, передвигая его с помощью стрелок.
Теперь нам надо создать Avatar Mask. Эта маска позволяет отключать выбранные анимации в клипе. Например, анимацию рук. Что нам и надо.
Давайте создадим эту маску и отредактируем ее в инспекторе. Для этого в окне Assets кликнем правой кнопкой мышки и в появившемся списке выберем Create>Avatar Mask.
Кликнем по созданной маске и в окне инспектора выберем пункт Humanoid, В развернувшемся пункте появится схематичное изображение человека. Нажимая на разные части тела, мы можем включать их в анимацию клипа или выключать.
Теперь надо назначить эту маску нашему персонажу. Для этого во вкладке Hierarchy выберем персонажа и откроем окно Animator. Слева вверху мы видим список слоев анимации. Сейчас у нас правда только один слой под названием Base Layer.
Нажмем на кнопку в виде шестерёнки и в появившемся окне назначим в пункт Mask нашу маску и поставим галочку в пункт IK Pass, что означает, что мы включили инверсную кинематику.
Поэкспериментируем. Нажмем Play и попробуем отключать части тела в маске.
И перейдем к написанию скрипта.
Создадим новый скрипт (класс) для этого кликнем правой кнопкой мыши в окне Assets и в появившемся списке выберем Create>C# Script
Откроем созданный скрипт в редакторе Visual Studio. Давайте напишем и рассмотрим его подробнее тем более скрипт очень простой.
Осталось только назначить скрипт персонажу и назначит Game Object цели рук в Инспекторе.
Нажимаем Play и видим, что ничего не изменилось. Это потому, что включение кинематики в скрипте по умолчанию выключено. В инспекторе ставим галочку напротив IsActive и ура – руки персонажа заняли позиции Game Object.
Примерно так работает Инверсная Кинематика в Unity3d. Применять ее можно по разному, все зависит от того, что требуется и насколько хватит фантазии.