Новое оружие без новых анимаций: адаптируем локомоцию в 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 = заменить/смешать часть позы по костям.
Собираем сетап
Окей, приступим к сборке сетапа.
Наша анимация ( поза)
Alpha выдает 1, когда мы даем персонажу в руки оружие, и именно в этот момент срабатывает Layered Blend per Bone.
Рассмотрим настройки Layered Blend per Bone.
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 для левой руки
Давайте это исправим. Для этого соберем такой сетап:
Рассмотрим настройки ноды 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.
Теперь мне нужны координаты для этой ноды, чтобы левая рука с помощью неё всегда следовала за оружием.
Создаём Socket на оружии
Перейдём в Mesh оружия.
Там создадим Socket.
Socket это специальная точка, привязанная к кости Skeletal Mesh или к положению Static mesh
Она нужна, чтобы удобно прикреплять к персонажу другие объекты:
Hand Bone ( обычно под оружие создается отдельная кость) к нему создаем Socket "WeaponSocket" а к нему крепим Оружие
Socket хранит свое положение и вращение относительно кости и двигается вместе с ней.
Skeletal Mesh 3D-модель со скелетом и скиннингом. Кости двигают и деформируют модель, поэтому её можно анимировать.
Примеры: персонажи, животные, одежда.
Static Mesh обычная 3D-модель без скелета и скиннинга. Она не деформируется костями и обычно используется для неподвижных или цельных объектов.
Примеры: стены, мебель, оружие, камни, здания.
Спавним оружие
Теперь зайдем в Blueprint персонажа.
по нажатию кнопки я делаю Spawn оружия ( это костыль для тестирования )
Spawn это создание объекта прямо во время работы игры.
Например:
Spawn Actor
создать врага
создать оружие
создать пулю
создать эффект
До Spawn объекта в мире нет. После вызова Spawn Unreal создаёт его экземпляр и помещает в мир.
Зайдем в 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.
И там вызовем оружие которое с Заспавнил
После каста к GirlCharacter_CMC я сохраняю ссылку на персонажа. Затем проверяю, существует ли BPWeapon.
Если оружие валидно, получаю у него Transform сокета IKSocket, сохраняю его в переменную Two Hand Weapon и устанавливаю Alpha = 1, включая IK для второй руки.
Идём к нашей Two Bone IK и применяем данные Socket к Two Bone IK.
Смотрим на результат
Если нужно, мы можем подкорректировать положение руки на оружии, двигая Socket.
Итого: оружие крепится к правой руке и следует за ней, а левая рука персонажа следует за положением Socket на оружии.
Дополнительно уменьшаем амплитуду
Ещё можно уменьшить общую амплитуду анимации при помощи такого приёма:
Я использую еще одну ноду Layered Blend per Bone. Ставлю spine_03 и вес воздействия, скажем, 0.4. То есть поза без анимации съест часть анимации бега.
Еще по хорошему лучше замедлить скорость бега - при выборе тяжелого оружия
Зачем это нужно?
Допустим, у вас есть очень тяжёлое оружие, и амплитуду спины и рук вы хотите очень сильно прижать.
Дальш можно настраивать позы для разного оружия и условия по которым они будут включатся и выключатся и анимации доставки этого оружия