Анимация персонажей (скелет, клипы, Animator)
Модель со скелетом (FBX или glTF/GLB с костями и весами) оживает компонентом Animator: он играет клипы, плавно переходит между ними и деформирует модель каждый кадр. Текстура, шейдеры, тени работают как у обычной модели.
Быстрый старт
- Положите на сцену модель персонажа (
.fbx,.glb). - Добавить компонент → Animator. В списке «клип» — все клипы модели. Анимация видна прямо в окне сцены, без запуска игры.
- В скрипте:
let monster = ctx.find("Counter").unwrap();
ctx.play_animation(monster, "Walk_Nervous"); // плавный переход из текущего клипа
ctx.set_animation_speed(monster, 1.4); // шаги в такт настоящей скорости
let clips = ctx.animation_clips(monster); // что есть у моделиПолный доступ — через компонент: ctx.get_mut_of::<Animator>(e) (поля clip, speed, looping, playing, fade; только для чтения — time, clips).
Откуда берутся клипы
- Из файла. Все анимации FBX (
Rig|Walkпревращается вWalk) и glTF. Клипы ходьбы делаются «на месте»: прямолинейный снос бёдер вперёд убирается (покачивание остаётся), потому что объект двигает скрипт. - Процедурные для гуманоидов. Если кости названы привычно (
hips/pelvis,spine,chest,neck,head,upper_arm,forearm,hand,thigh,shin,foot, стороны.L/.R,_left/_right,Left…— подходит и Mixamo), модель получает клипы, которых в файле нет:
| Клип | Что делает |
|---|---|
Idle | дыхание, перенос веса, взгляд по сторонам |
Walk, Run | шаг и бег с работой рук и корпуса |
Talk | кивки и жесты рукой |
Wave | машет рукой |
Sit | сидит (опустите объект на высоту сиденья) |
Wipe | протирает стойку |
Look | оглядывается |
Оси персонажа (верх, право, вперёд) берутся из позы покоя, руки из T- или A-позы опускаются сами, поэтому клипы подходят к любой модели с такими костями.
Переходы и точность
- Смена
clipдаёт плавный переход длинойfadeсекунд (0 — мгновенно). looping = false— клип останавливается на последнем кадре (удар, падение).- Скиннинг — до четырёх костей на вершину, на процессоре: несколько тысяч вершин — микросекунды.
- Поза покоя совпадает с моделью без анимации точно (это проверяет тест
cargo test -p kvas_engine --test skeletal).
Пример: LAST SERVICE
MonsterAiвыбирает клип по состоянию монстра:Idle_Watchful,Walk_Nervous,Run_Frantic,Screamпри первом появлении,Attack_Lungeпри поимке; скорость клипа подгоняется под скорость движения.- Скрипт
Npcна Анне и Павле: работа (Wipe— Анна протирает стойку,Look— Павел оглядывается), поворот к игроку иIdle, когда он рядом,Talkпока звучит реплика этого персонажа,Sitв финале.
IK: ступни на земле и взгляд
Компонент CharacterIk рядом с Animator (только для гуманоидов):
feet— ступни ставятся на настоящие коллайдеры под ними: на ступеньках, склонах, бордюрах бёдра опускаются под нижнюю ногу, колени сгибаются (IK двух костей, колено остаётся в своей плоскости), подъём ноги из клипа сохраняется.max_step— насколько ногу можно поднять или опустить. Работает в запущенной игре (нужна физика).look_at— имя объекта, на который смотреть, или точка из скрипта. Поворачиваются грудь, шея и голова (20 / 30 / 50 %) в пределахlook_limitградусов, плавно; цель за спиной отпускается.
let eyes = ctx.find("Eyes").map(|e| ctx.world_matrix_of(e).w_axis.truncate());
ctx.look_at_point(npc, eyes); // смотреть на игрока
ctx.look_at_point(npc, None); // отпустить взглядРэгдолл
Компонент Ragdoll (или ctx.ragdoll(entity, impulse)): тело персонажа становится капсулами физики — таз, грудь, голова, плечи, предплечья, бёдра, голени — на шаровых шарнирах. Они появляются ровно в позе клипа, получают скорость объекта и толчок impulse в грудь, сталкиваются с миром, но не друг с другом. Скелет следует за телами, кисти и стопы — за предплечьями и голенями.
ctx.ragdoll(enemy, hit_dir * 40.0); // упасть от удара
ctx.stop_ragdoll(enemy); // убрать тела, снова играет клипmass — общая масса (делится по частям), damping — «вязкость» суставов.
В LAST SERVICE: Анна и Павел смотрят Лиде в глаза, когда она рядом; Счётчик следит за ней головой и ставит ноги на пол, а в финале у остановки обмякает и падает.