Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

Небольшая статья о том, как адаптировать существующие анимации под позу с новым оружием.

Разберём:

Layered Blend per Bone

Two Bone IK

работу с Socket

привязку второй руки к оружию

Зачем это нужно ? скажем у вас есть 400 анимаций перемещений и вы хотите добавить скажем алебарду или двуручный молот персонажу и не делать еще 400 новых анимаций

Локомоция (Locomotion System ) Система перемещений персонажей

мой телеграмм про анимацию и Unreal

Итак, основная проблема, когда мы подмешиваем позу с оружием с помощью Apply Additive поверх анимации, это то, что без оружия амплитуда движения рук может быть сильной.

И если мы просто подмешиваем позу поверх нашего персонажа, оружие будет колбасить.

Примерно так:

Если используем Layered Blend per Bone при использовании позы, то мы можем убить анимацию с рук и тела.

так

Или так

Анимация на руках деревянная

Apply Additive и Layered Blend per Bone

Apply Additive добавляет аддитивную позу поверх базовой анимации.

Base Pose + Additive Pose = Result

Например: бег + наклон корпуса / Aim / дыхание.

Layered Blend per Bone смешивает две полноценные позы только на выбранной части скелета.

Ноги = Base

Верх тела = Blend Pose

Например: ноги продолжают бег, а начиная с spine_01 проигрывается анимация стрельбы.

Коротко:

Apply Additive = добавить изменение к позе.Layered Blend per Bone = заменить/смешать часть позы по костям.

Собираем сетап

Окей, приступим к сборке сетапа.

Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

Наша анимация ( поза)

Alpha выдает 1, когда мы даем персонажу в руки оружие, и именно в этот момент срабатывает Layered Blend per Bone.

Рассмотрим настройки Layered Blend per Bone.

Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

Layered Blend per Bone здесь смешивает базовую локомоцию с Girl_WeaponTest только на выбранных костях.

Конкретно:

Base Pose = обычная локомоция

Blend Pose 0 = Girl_WeaponTest

Alpha = сила смешивания

А справа в Branch Filters:

clavicle_l

clavicle_r ( ключица)

это кости, с которых начинается влияние второй позы.

Blend Depth определяет, насколько глубоко по иерархии дочерних костей пойдёт влияние.

Blend Depth = 0 влияние начинается сразу с указанной кости и идет на всю её дочернюю цепочку с полным весом.

Blend Depth = 3 влияние плавно нарастает за 3 уровня костей.

Условно:

Depth 0:

clavicle → 100%

upperarm → 100%

lowerarm → 100%

hand → 100%

Depth 3:

clavicle → слабее

upperarm → сильнее

lowerarm → ещё сильнее

hand → 100%

То есть 0 = резкая граница, 3 = более мягкий переход по иерархии костей.

Таким образом мы частично сохранить анимацию на правой руки

Однако есть проблема - левая рука не совпадает с оружием

Two Bone IK для левой руки

Давайте это исправим. Для этого соберем такой сетап:

Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

Рассмотрим настройки ноды Two Bone IK.

IK Bone = hand_l — конечная кость IK-цепи. То есть IK двигает левую руку, заканчивая расчёт на кисти.

Effector Location — куда должна прийти кисть. У меня берется Two Hand Weapon Location.

Effector Location Space = World Space — координаты цели кисти задаются в мировых координатах.

Joint Target Location — куда должен смотреть/сгибаться локоть. Это по сути Pole Vector.

Joint Target Location Space = Bone Space — положение цели локтя считается относительно выбранной кости.

Joint Target = lowerarm_l — кость, относительно которой задан Joint Target.

Alpha сила IK: 0 = IK выключен, 1 = полностью работает.

Если коротко: рука будет следовать за координатами из переменной Two Hand Weapon Location.

Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

Теперь мне нужны координаты для этой ноды, чтобы левая рука с помощью неё всегда следовала за оружием.

Создаём Socket на оружии

Перейдём в Mesh оружия.

Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

Там создадим Socket.

Socket это специальная точка, привязанная к кости Skeletal Mesh или к положению Static mesh

Она нужна, чтобы удобно прикреплять к персонажу другие объекты:

Hand Bone ( обычно под оружие создается отдельная кость) к нему создаем Socket "WeaponSocket" а к нему крепим Оружие

Socket хранит свое положение и вращение относительно кости и двигается вместе с ней.

Skeletal Mesh 3D-модель со скелетом и скиннингом. Кости двигают и деформируют модель, поэтому её можно анимировать.

Примеры: персонажи, животные, одежда.

Static Mesh обычная 3D-модель без скелета и скиннинга. Она не деформируется костями и обычно используется для неподвижных или цельных объектов.

Примеры: стены, мебель, оружие, камни, здания.

Спавним оружие

Теперь зайдем в Blueprint персонажа.

Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

по нажатию кнопки я делаю Spawn оружия ( это костыль для тестирования )

Spawn это создание объекта прямо во время работы игры.

Например:

Spawn Actor

создать врага

создать оружие

создать пулю

создать эффект

До Spawn объекта в мире нет. После вызова Spawn Unreal создаёт его экземпляр и помещает в мир.

Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

Зайдем в Spawn Weapon

Сначала я беру Transform кости WeaponR на Mesh персонажа и спавню в этой точке оружие. После этого прикрепляю его к сокету правой руки и сохраняю ссылку на созданный Blueprint оружия.

Затем уже у самого оружия получаю Transform сокета IKSocket и сохраняю его в переменную Two Hand Weapon. В дальнейшем эту точку можно использовать как цель для IK второй руки.

В конце я беру из оружия Transform IKSocket.

Теперь мне этот Transform нужно передать в Animation Blueprint персонажа и применить к ноде Two Bone IK.

Transform — это набор из трёх параметров объекта:

  • Location позиция;
  • Rotation поворот;
  • Scale масштаб.

То есть Transform описывает где объект находится, как повернут и какого он размера.

Передаем данные в Animation Blueprint

Перейдём в Animation Blueprint.

И там вызовем оружие которое с Заспавнил

Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

После каста к GirlCharacter_CMC я сохраняю ссылку на персонажа. Затем проверяю, существует ли BPWeapon.

Если оружие валидно, получаю у него Transform сокета IKSocket, сохраняю его в переменную Two Hand Weapon и устанавливаю Alpha = 1, включая IK для второй руки.

Идём к нашей Two Bone IK и применяем данные Socket к Two Bone IK.

Новое оружие без новых анимаций: адаптируем локомоцию в Unreal Engine

Смотрим на результат

Если нужно, мы можем подкорректировать положение руки на оружии, двигая Socket.

Итого: оружие крепится к правой руке и следует за ней, а левая рука персонажа следует за положением Socket на оружии.

Дополнительно уменьшаем амплитуду

Ещё можно уменьшить общую амплитуду анимации при помощи такого приёма:

Я использую еще одну ноду Layered Blend per Bone. Ставлю spine_03 и вес воздействия, скажем, 0.4. То есть поза без анимации съест часть анимации бега.

Еще по хорошему лучше замедлить скорость бега - при выборе тяжелого оружия

Зачем это нужно?

Допустим, у вас есть очень тяжёлое оружие, и амплитуду спины и рук вы хотите очень сильно прижать.

Дальш можно настраивать позы для разного оружия и условия по которым они будут включатся и выключатся и анимации доставки этого оружия

272
21
5
5
4
3
2
1