Control Rig против потолка: делаем автоматический наклон персонажа
Рассмотрим как можно сделать вот такие процедурные наклоны
Мой телеграмм канал об анимации и unreal
Начнем с Control Rig
Создадим Sphere Trace By Trace Channel
Sphere Trace by Trace Channel проверка столкновения сферой, протянутой от точки Start до точки End.
В нашем случае:
Start = X 0, Y 0, Z 80
End = X 0, Y 70, Z 200
Radius = 60
Trace Channel = Visibility
То есть Unreal делает примерно так:
Берёт сферу радиусом 60 → двигает её из точки Start в точку End → смотрит, задела ли она что-то по каналу Visibility.
Если задела:
Hit = true
Hit Location = место удара
Hit Normal = нормаль поверхности
Если не задела:
Hit = false
Чтобы посмотреть как это выглядит визуально сделаем так
Я добавил debug-визуализацию в Control Rig через Draw Line. Линия показывает, откуда и куда идёт проверка перед персонажем: от точки 0,0,80 до 0,70,200. Это нужно, чтобы видеть зону трейса и понимать, правильно ли она расположена относительно персонажа.
Идем дальше
После попадания Sphere trace в препятствие , беру Hit Location ( место попадание трейса в препятствие)
1. Distance Between
считаю расстояние от точки удара до базовой точки персонажа с помощью Distance Between.
2. Remap
Затем через Remap перевожу это расстояние в удобные значения
Remap берёт значение из одного диапазона и переводит его в другой диапазон.
Clamp ограничивает результат, чтобы он не вышел за эти пределы.
У меня:
Source Minimum = 30
Source Maximum = 120
Target Minimum = -30
Target Maximum = 0
Это значит:
если Distance = 30 ( между стартом Trace и точкой попадания) → Result = -30
если Distance = 120 → Result = 0
То есть чем ближе препятствие, тем сильнее отрицательное смещение.
один Remap дает величину смещения Pelvis вниз , второй нужен для наклона персонажа .
Пока будем рассматривать работу Pelvis
Дальше используем ноду IF
IF — это условие:
если Hit = true, берем значение из Remap; если Hit = false, ставим 0 ( то есть нечего не меняем) .
Spring Interpolate — плавно доводит текущее значение до цели с эффектом пружины.
Нужен, чтобы таз не дергался резко, а мягко отклонялся и возвращался назад.
Теперь соединим всё это с Full Body IK.
Рассмотрим как это работает
Full Body IK — это нода, которая двигает всё тело через IK, а не одну кость отдельно.
Она берёт цель, например смещенный pelvis, и пересчитывает остальные кости так, чтобы тело перестроилось естественно
Берем текущую позицию кости pelvis и добавляем к ней процедурное смещение от препятствия.
Логика такая:
Get Transform - Bone pelvis
↓
берём текущую Translation таза
↓
Add
↓
прибавляем к ней значение из Spring Interpolate
Spring Interpolate даёт плавное значение смещения, поэтому pelvis не дёргается резко, а мягко уходит от препятствия и возвращается обратно.
Рейты мы берем из Get transform Bone от pelvis и присоединяем в ноду FullBody IK
А вот транслеты мы добавляем от Spring Interpolate - по тем осям которые хотим сместить
Видео пример :
Идем дальше
Берём текущий Transform костей через Get Transform - Bone :
foot_l
foot_r
и передаем их в эффекты Full Body IK.
Зачем
стопы получают свои текущие позиции
Full Body IK старается удерживать их на месте
pelvis можно двигать процедурно
ноги и тело подстраиваются, но стопы не улетают
Настройки ноды FullBody
Root = root — вся IK-система считается от корневой кости.
Bone = foot_l / foot_r — эффекторами выбраны левая и правая стопа.
Chain Depth = 2
Chain Depth определяет, сколько костей вверх от эффектора будет участвовать в IK-цепочке.
Пример для foot_l:
Chain Depth = 2
Значит Full Body IK берёт стопу и поднимается выше по ноге примерно на 2 кости:
foot → calf → thigh
Если стоит Chain Depth = 0 значит влияние не ограниченно
Теперь настроим значения для наклона спины
Вернемся к Remap ;
Тут настройки чутка другие - однако принцип тот же
в Target Minimum ставим 1 - чуть позже поймете зачем
Теперь так же сделаем IF и Spring Interpolate и поместим их за нодой Full Body IK
Логика подключения такая же как и с pelvis
Теперь создадим кривую
И из Spring Interpolate для спины передадим значения во вход Value ноды SetCurve Value
И подключим все это дело к Forward Solver
И так настройка Control Rig окончена , теперь настроим Additional анимацию для сгиба спины .
Есть вот такая анимация
Additive Anim Type Local Space
Анимация считается как добавка в локальном пространстве костей. То есть кости смещаются/вращаются относительно своих родителей.
Base Pose Type Frame from this animationБазовая поза берётся из этой же анимации, из конкретного кадра. Unreal сравнивает остальные кадры с этой позой и оставляет только разницу.
Ref Frame Index 0 В качестве базы используется кадр 0, то есть первый кадр анимации.
Также я анимировал только верх тела, чтобы анимация не ломала анимацию ног.
Теперь подключим это дело в Animation Blueprint
Короткое видео что нужно сделать
Разберем по шагам
Get Curve Value CrouchAmount
Берет значение кривой CrouchAmount. ( именно эту кривую я сделал в Control Rig )
Эта кривая управляет, насколько сильно включается crouch/additive-поза.
Напомню: в Crouch Amount я подаю значение от 0 до 1,
где 0 соответствует 0 -мн кадру анимации, а 1 = 30-му кадру. По сути,
единица равна одной секунде. Если бы анимация была 60 кадров при
30 fps, то из Control Rig нужно было бы подавать значение от 0 до 2.
BlendCrouch_Anim Sequence Evaluator
Не проигрывает анимацию по времени сам, а берет конкретный кадр по значению Explicit Time.
То есть кривая Crouch Amount выбирает, какой момент additive-анимации использовать.
Apply Additive
Добавляет Blend Crouch Anim поверх основной позы.
Control Rig
После additive-анимации запускается наш Control Rig
Окей, логика готова, но это ещё не всё.
Нужно настроить изменение размера Капсулы - когда мы подходим к препятствию
Идем в Blueprint персонажа
В моем случае это BP Third Person Character
Там в Character Movement
Character Movement — компонент, который отвечает за движение персонажа: ходьба, бег, прыжок, crouch и т.д.
Crouched Half Height = 60 cm Высота капсулы в crouch-состоянии. То есть когда персонаж приседает, коллизия становится ниже. ( это нужный нам параметр )
Max Walk Speed Crouched = 450 cm/s Максимальная скорость движения в crouch. Чем меньше значение — тем медленнее персонаж двигается в приседе.
Can Crouch Разрешает персонажу использовать crouch. Без этого Crouch / UnCrouch нормально работать не будут.
Теперь идем в Animation Blueprint
И строим такую логику
Get Curve Value Берет значение кривой CrouchAmount из Control Rig.
если CrouchAmount > 0.1
→ считаем, что crouch включён
иначе
→ crouch выключен
Branch Обычный if.
- True → вызывает Crouch
- False → вызывает UnCrouch
Crouch ( это команда из Character Movement) Переводит персонажа в состояние приседа:
- уменьшает капсулу,
- применяет настройки crouch из Character Movement
- может менять скорость и другую связанную логику.
UnCrouch Возвращает персонажа из приседа обратно в обычное состояние.
Third Person Это ссылка на BP Third Person Character из которого мы и берем Crouch and Un Crouch
По смотрим как уменьшается капсула
как видно из видео у камеры есть скачек , исправим это
Идем в BP Third Person Character и там в camera Boom
Enable Camera Lag
Включает плавное запаздывание камеры за персонажем.
Без этого камера жестко приклеена.
Camera Lag Speed = 10
Скорость догоняния камеры.
Больше значение → камера быстрее догоняет, меньше лаг.
Меньше значение → камера мягче и сильнее отстаёт.
Camera Lag Max Distance = 50
Максимальное расстояние, на которое камера может отстать от цели.
Собственно Все
Так же то что мы вызываем команду Crouch - предотвращаем возможность прыжка - когда мы пригнулись
Мой тг канал
Про unreal и анимацию