AnimationGroup из импортированных glTF-файлов

Babylon.js — это мощная библиотека для создания 3D-приложений и игр в браузере с использованием WebGL. Одним из важнейших аспектов при работе с 3D-объектами является анимация. Анимации могут быть импортированы в Babylon.js через формат glTF, который является популярным стандартом для обмена 3D-моделями, включая анимации.

Одной из ключевых сущностей для работы с анимациями в Babylon.js является AnimationGroup. Эта сущность позволяет группировать анимации для различных объектов и управлять ими как единым целым. В данной статье будет рассмотрено, как работать с AnimationGroup, используя анимации, экспортированные из glTF-файлов.

Структура glTF-анимированных моделей

Формат glTF поддерживает не только геометрию, текстуры и материалы, но и анимации. Анимации в glTF представляют собой последовательности кадров, которые могут быть привязаны к различным свойствам объектов, таким как положение, поворот, масштаб и материалы.

Когда glTF-файл содержит анимацию, его загрузка в Babylon.js создаст соответствующие анимационные данные, которые будут доступны через API библиотеки. Эти данные включают в себя такие элементы, как AnimationGroup и Animation.

Загрузка glTF-файлов с анимацией

Для начала необходимо загрузить glTF-файл с анимацией в Babylon.js. Это можно сделать с помощью метода SceneLoader.Append, который позволяет загрузить и добавить модель в сцену. Например:

BABYLON.SceneLoader.Append("assets/", "model_with_animation.glb", scene, function (scene) {
    console.log("Модель с анимацией успешно загружена!");
});

Здесь мы используем формат .glb, который является бинарной версией glTF и поддерживает все типы данных, включая анимации.

Что такое AnimationGroup?

AnimationGroup представляет собой контейнер для одной или нескольких анимаций, применяемых к объектам сцены. Каждый AnimationGroup может содержать несколько анимаций, и вы можете управлять их воспроизведением, остановкой и воспроизведением в цикле.

После загрузки glTF-файла с анимацией, Babylon.js автоматически создаст AnimationGroup для каждой анимации, содержащейся в модели. Получить доступ к этим группам можно через свойства сцены.

Пример получения AnimationGroup:

scene.animationGroups.forEach(function (group) {
    console.log("Найден AnimationGroup: " + group.name);
});

Применение AnimationGroup

Анимации из glTF, загруженные в Babylon.js, можно применить к объектам сцены с помощью AnimationGroup. Например, чтобы начать воспроизведение анимации для определённого объекта, можно использовать следующий код:

var animationGroup = scene.animationGroups[0]; // Предположим, что это первый AnimationGroup
animationGroup.start(true); // true — означает бесконечный цикл анимации

В данном случае, анимация начнется и будет проигрываться в бесконечном цикле. Если необходимо контролировать скорость или другие параметры, их можно задать через параметры AnimationGroup.

Управление анимациями в AnimationGroup

AnimationGroup имеет несколько важных методов и свойств для управления воспроизведением анимаций:

  • start() — Начинает воспроизведение анимации. Принимает параметр loop, который указывает, будет ли анимация повторяться.
  • pause() — Приостанавливает воспроизведение анимации.
  • stop() — Останавливает анимацию.
  • isRunning — Свойство, которое указывает, воспроизводится ли анимация в данный момент.
  • speedRatio — С помощью этого свойства можно изменять скорость воспроизведения анимации.

Пример изменения скорости анимации:

animationGroup.speedRatio = 0.5; // Уменьшение скорости анимации в 2 раза

Также можно работать с состояниями анимации, например, для переходов между различными анимациями или для синхронизации анимаций с другими действиями на сцене.

Работа с несколькими AnimationGroup

Часто в сценах бывает несколько объектов, каждый из которых имеет свои анимации. В таких случаях можно работать с несколькими AnimationGroup одновременно. Например, можно воспроизводить анимации для разных объектов синхронно или с разными задержками.

Пример:

scene.animationGroups.forEach(function (group, index) {
    setTimeout(function () {
        group.start(true); // Начинаем анимацию через заданную задержку
    }, index * 1000); // Задержка в 1 секунду для каждого следующего AnimationGroup
});

Этот код начнёт воспроизведение анимаций для объектов с задержкой в 1 секунду между каждым стартом анимации.

Синхронизация анимаций

Одной из мощных возможностей AnimationGroup является синхронизация анимаций. Для этого можно использовать метод syncWith(), который позволяет синхронизировать одну анимацию с другой.

Пример синхронизации:

var group1 = scene.animationGroups[0];
var group2 = scene.animationGroups[1];

// Синхронизация group2 с group1
group2.syncWith(group1);

Это позволяет начать воспроизведение нескольких анимаций одновременно, что полезно, если нужно, чтобы несколько объектов двигались или изменялись в одном темпе.

Завершение анимации

Когда анимация завершена, можно выполнить дополнительные действия с объектами сцены. Для этого используется событие onAnimationEnd, которое срабатывает, когда анимация завершена.

Пример:

animationGroup.onAnimationEndObservable.add(function () {
    console.log("Анимация завершена!");
});

Такое поведение удобно для создания последовательных действий после завершения анимации, например, для запуска новой анимации или выполнения другой логики.

Заключение

Работа с AnimationGroup в Babylon.js позволяет эффективно управлять анимациями объектов, загруженных из glTF-файлов. С помощью этой сущности можно организовывать сложные сцены с несколькими анимациями, синхронизировать их и контролировать их поведение. Использование AnimationGroup даёт гибкость и контроль над анимационным процессом в 3D-приложениях, создавая динамичные и взаимодействующие объекты.