Цепочки анимаций

A-Frame — это мощный фреймворк для создания VR-сцен на основе HTML и JavaScript. Одним из ключевых аспектов динамических сцен является возможность создавать последовательные анимации объектов, которые выполняются одна за другой. Цепочки анимаций позволяют добиться более сложных и плавных эффектов, управлять состоянием объектов и синхронизировать действия нескольких элементов сцены.

В A-Frame для анимаций используется компонент animation и его расширение animation__<имя>. Каждая анимация имеет собственные параметры: свойство объекта, начальное и конечное значение, продолжительность и функцию интерполяции (easing).


Создание простой цепочки анимаций

Для организации последовательных анимаций необходимо использовать события (event) и слушатели событий. Пример простой цепочки для объекта <a-box>:

<a-scene>
  <a-box id="box" position="0 1 -3" color="red">
    <a-animation attribute="position" to="0 3 -3" dur="1000" begin="start"></a-animation>
    <a-animation attribute="rotation" to="0 360 0" dur="2000" begin="animationcomplete"></a-animation>
  </a-box>
</a-scene>

<script>
  const box = document.querySelector('#box');
  box.emit('start'); // запуск первой анимации
</script>

Разбор механизма:

  • Первая анимация начинается при событии start.
  • Вторая анимация привязана к событию animationcomplete, которое автоматически испускается после завершения первой анимации.
  • Использование emit() позволяет программно запускать цепочки и управлять временем их начала.

Использование нескольких именованных анимаций

A-Frame поддерживает несколько анимаций на одном объекте через префикс animation__<имя>. Это позволяет избежать конфликта анимаций и управлять каждой отдельно:

<a-box id="box" position="0 1 -3" color="blue">
  <a-animation__move attribute="position" to="0 3 -3" dur="1000" begin="start"></a-animation__move>
  <a-animation__rotate attribute="rotation" to="0 360 0" dur="2000" begin="moveComplete"></a-animation__rotate>
</a-box>

<script>
  const box = document.querySelector('#box');

  box.addEventListener('animation__move-complete', () => {
    box.emit('moveComplete'); // запуск следующей анимации
  });

  box.emit('start');
</script>

Особенности именованных анимаций:

  • Каждая анимация имеет уникальное имя (animation__move, animation__rotate), что позволяет ссылаться на её завершение через событие animation__<имя>-complete.
  • Цепочки могут состоять из произвольного числа анимаций, управляемых через события.

Последовательные трансформации с помощью JavaScript

Для более сложных цепочек часто используют JavaScript, чтобы динамически изменять параметры анимации и запускать их по условиям:

const box = document.querySelector('#box');

function animateBox() {
  box.setAttribute('animation__1', {
    property: 'position',
    to: '0 3 -3',
    dur: 1000,
    easing: 'easeInOutQuad',
    startEvents: 'startAnim'
  });

  box.setAttribute('animation__2', {
    property: 'rotation',
    to: '0 360 0',
    dur: 2000,
    startEvents: 'rotationAnim'
  });

  box.addEventListener('animation__1-complete', () => {
    box.emit('rotationAnim');
  });

  box.emit('startAnim');
}

animateBox();

Преимущества такого подхода:

  • Возможность изменять анимации на лету, включая длительность и траекторию.
  • Легко интегрируется с логикой игры или интерактивного VR-сценария.
  • Позволяет создавать цепочки, где следующий шаг зависит от условий или событий пользователя.

Синхронизация нескольких объектов

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

const box = document.querySelector('#box');
const sphere = document.querySelector('#sphere');

box.addEventListener('animation__move-complete', () => {
  sphere.emit('startMove'); // синхронный запуск анимации сферы
});

box.emit('startMove');

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


Использование animation-mixer для сложной анимации

Для 3D-моделей формата glTF можно использовать компонент animation-mixer, который позволяет проигрывать анимации скелетных моделей. Цепочки здесь формируются с помощью событий анимации:

<a-entity gltf-model="#robot" animation-mixer></a-entity>

<script>
  const robot = document.querySelector('[gltf-model]');
  robot.addEventListener('animation-finished', () => {
    // запуск следующей анимации скелета
    robot.setAttribute('animation-mixer', 'clip: Walk');
  });
</script>

Особенности animation-mixer:

  • Поддержка сложных скелетных анимаций.
  • Можно переключаться между клипами, создавая последовательные движения персонажей.
  • Возможность комбинировать с обычными animation для одновременной анимации позиции, цвета или масштабов объектов.

Советы по построению цепочек

  • Использовать именованные анимации для контроля и отладки.
  • Применять события animation__<name>-complete для автоматического запуска следующей анимации.
  • Сохранять ясную структуру цепочки, особенно если участвует несколько объектов.
  • Использовать JavaScript для динамических цепочек, зависящих от действий пользователя или состояния сцены.
  • Для glTF и сложных 3D-моделей применять animation-mixer, чтобы синхронизировать скелетные анимации с трансформациями объектов.

Цепочки анимаций в A-Frame дают возможность создавать плавные, интерактивные VR-сцены, контролировать последовательность действий и интегрировать анимации в сложные сценарии виртуальной реальности.