Skip to content

Анимация персонажей (скелет, клипы, Animator) ​

Модель со скелетом (FBX или glTF/GLB с костями и весами) оживает компонентом Animator: он играет клипы, плавно переходит между ними и деформирует модель каждый кадр. Текстура, шейдеры, тени работают как у обычной модели.

Быстрый старт ​

  1. Положите на сцену модель персонажа (.fbx, .glb).
  2. Добавить компонент → Animator. В списке «клип» — все клипы модели. Анимация видна прямо в окне сцены, без запуска игры.
  3. В скрипте:
rust
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 градусов, плавно; цель за спиной отпускается.
rust
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 в грудь, сталкиваются с миром, но не друг с другом. Скелет следует за телами, кисти и стопы — за предплечьями и голенями.

rust
ctx.ragdoll(enemy, hit_dir * 40.0); // упасть от удара
ctx.stop_ragdoll(enemy);            // убрать тела, снова играет клип

mass — общая масса (делится по частям), damping — «вязкость» суставов.

В LAST SERVICE: Анна и Павел смотрят Лиде в глаза, когда она рядом; Счётчик следит за ней головой и ставит ноги на пол, а в финале у остановки обмякает и падает.

Kvas Engine