HollowCore glTF | Контроллер анимации
Уже прошла почти неделя с того, как я начал переписывать систему анимаций. Собственно а зачем она нужна, если прошлая прекрасно работала? Увы, очень многое на ней было нельзя реализовать, например:
- Настроить скорость перехода между анимациями (например, при запуске задержка должна быть меньше, чем при завершении)
- Настроить скорость самих анимаций (Условно, чтобы синхронизировать скорость ходьбы со скоростью передвижения моба)
- Все переходы между анимациями происходили через Bind-позу (Поза в которой сохранён персонаж), т.е. если вам нужно чтобы персонаж будучи в положении лёжа - сел, то раньше такой переход проходил как "лежать -> стоять (Bind поза) -> сидеть".
- Не было возможности плавно переходить от одной анимации к другой (например постепенно из ходьбы в бег)
Теперь же большая часть из этих вещей исправлена, а также появилось больше функционала. Новая система предоставляет не только возможности запуска анимаций, но и много чего ещё.
В первую очередь, создавая контроллер анимаций, вы сможете создать несколько программируемых слоёв.
Сам слой управляет тем, какие анимации и в каких пропорциях нужно применить. У него есть следующие параметры:
1. Имя - название слоя, используется для того, чтобы в случае чего получить слой и изменить его параметры, затриггерить событие и т.п.
2. Режим наложения (Добавочный / Перезаписывающий). Первый добавляет анимации складывая с прошлой позой персонажа "накапливая" эффект нескольких слоёв, второй же полностью сбрасывает позу персонажа полностью перезаписывая всё своей анимацией.
3. Приоритет слоя - определяет в каком порядке будут применяться слои. Те что меньше - будут применяться первыми, те что больше - последними. Что довольно важно в совокупности с прошлым пунктом.
4. Маска слоя - определяет какие кости сможет изменить анимация на этом слое, например можно сделать чтобы анимация влияла только на верхнюю часть модели, или только на лицо. (пока не учитывает вложенные части и нужно указывать прям все)
5. StateMachine - состояния и переходы.
Состояния - определяют какую(ие) анимации воспроизводить в текущий момент. Одновременно может воспроизводиться только 1 состояние (но можно создать несколько слоёв)
Переходы же определяют, когда нужно завершить одно состояние и перейти в следующее
Параметры состояния:
1. Имя - название состояния (не анимации), используется в переходах.
2. Клип - сама анимация, подробнее ниже.
3. Древо смешивания - ещё один вид анимации состоящей из нескольких, подробнее ниже.
4. Процедурная анимация - ещё один вид анимации, который можно запрограммировать. (Например поворот головы)
Параметры перехода:
1. from - Из какой анимации
2. to - В какую анимацию
3. condition - условие для перехода
4. duration - время перехода в секундах
5. (Будет когда бенди сделает пример :D) transitionClip - анимация перехода (если вам не нравится автоматически интерполированная)
Клип - сама анимация и её настройки:
1. Имя - название анимации из файла
2. WrapMode - режим обработки анимации:
- Once: один раз.
- Loop: В цикле.
- PingPong: В цикле до последнего кадра и обратно к первому.
- ClampForever: Остановить проигрывание на последнем кадре
3. Скорость - дополнительная скорость с которой будет проигрываться анимация. К тому же она может быть отрицательной.
Дерево смешивания - один из способов анимации, он состоит из параметра и списка анимаций с весами, например:
Параметр: Скорость моба
Список в формате [Скорость] | [Анимация]:
[0.0]: Клип Idle
[2.0]: Клип Walk
[3.5]: Клип Run
При проигрывании будет выбираться процентное соотношение анимаций, например при скорости 1.5 будет: 25% Idle, 75% Walk и 0% Run. Думаю суть ясна.
Процедурная анимация - способ анимации, при котором нет ключевых кадров, а вам нужно самому рассчитать, где будет какая часть тела в зависимости от времени. Чаще всего используется для анимации головы, инверсивной кинематики и т.п.
Пока что все условия и параметры вроде скорости пишутся на языке схожем с Molang. Я пока не уверен, долго ли эта задумка продержится и может стоит переписать всё на Kotlin… Но тащить огромный компилятор ради парочки анимаций как-то не хочется))
Вот, пока что примерный вариант того, как оно может выглядеть в виде кода. Выглядит достаточно громоздко, но в целом это довольно понятно и легко автоматизируется циклами или Enum'ами.
kts
player_model.animation_controller.kts2.70 Kb
Недавно показывал наработки у себя в Discord, получается что-то вроде такого))
А, ну и самое главное, что будет с анимациями, которые нужно запустить по триггеру, вроде тех, что в диалогах? А всё просто, вы всегда сможете добавлять, менять и удалять эти слои прямо в скрипте. К тому же я оставлю обратную совместимость с прошлыми функциями для анимаций и вполне вероятно даже автоматически генерируемый контроллер (хотя возможно вам всё же придётся указывать названия анимаций вручную, если это не встроенная модель, да и в любом случае, своё всегда надёжнее)
Вообще лучше пиши в Discord или Telegram, тут я редко бываю, да и файлы тут нормально не прикрепишь.
https://hollowhorizon.github.io/hollowengine.github.io/docs/scripting/scene/intro