Система Анимации

Обзор

В системе анимации «Вердж3Д» вы можете анимировать различные свойства ваших моделей: кости модели skinned and rigged model, morph targets, различные свойства материалов (цвет, прозрачность, булевы функции), видимость и трансформации. Анимированные свойства могут быть затухающими, перекрестными и деформированными. Вес и временные шкалы различных одновременных анимаций на одном и том же объекте, а также на разных объектах могут быть изменены независимо друг от друга. Различные анимации на одном и том же и на разных объектах могут быть синхронизированы.

Анимационная система «Вердж3Д» имеет архитектуру, схожую с «Юнити»/«Анриал Энжин 4». На этой странице вы можете ознакомиться с основными компонентами этой системы, а также узнать как они взаимодейстуют между собой.

Анимационные Клипы

Если вы успешно импортировали анимированный 3Д-объект (неважно, есть ли у него кости или morph targets или и то, и другое) - например, экспортировали его из Блендер с помощью Блендер exporter и загрузили в сцену «Вердж3Д» с помощью GLTFLoader, одним из свойств геометрии загруженного меша должен быть массив с именем "animations", содержащий AnimationClips для этой модели (см. список возможных загрузчиков ниже)..

Каждый AnimationClip обычно содержит данные для определенного действия объекта. Например, если меш является персонажем, может быть один AnimationClip для ходьбы, второй для прыжка, третий для уклонения в сторону и так далее.

Треки Ключевых Кадров

Внутри такого AnimationClip данные для каждого анимированного свойства хранятся в отдельной KeyframeTrack. Предположим, что объект персонажа имеет skeleton, одна дорожка ключевых кадров может хранить данные об изменении положения кости нижней части руки со временем, другая дорожка - данные об изменении вращения той же кости, третья данные о положении, вращении или масштабировании другой кости, и так далее. Следует понимать, что AnimationClip может состоять из множества таких дорожек.

Предполагается, что модель имеет morph targets (например, один morph target показывает дружелюбное лицо, а другой - сердитое), каждая дорожка содержит информацию о том, как меняется влияние Mesh.morphTargetInfluences определенной morph target во время исполнения клипа.

Микшер Анимации

Сохраненные данные составляют лишь основу для анимации - фактическое воспроизведение контролируется AnimationMixer. Вы можете представить его не только как плеер для анимаций, но и как имитацию аппаратуры, подобной настоящему микшерному пульту, который может управлять несколькими анимациями одновременно, смешивая и объединяя их.

Анимационные Действия

Сам AnimationMixer имеет очень мало (общих) свойств и методов, поскольку им можно управлять с помощью AnimationAction. Настроив AnimationAction, вы можете определить, когда определенный AnimationClip должен быть воспроизведен или остановлен на одном из микшеров, будет ли и как часто клип должен повторяться, должен ли он выполняться с затуханием или масштабированием времени, и некоторые дополнительные вещи, такие как кроссфейдинг или синхронизация.

Анимация Группы Объектов

Если вы хотите, чтобы группа объектов получала общую анимацию, вы можете использовать элемент AnimationObjectGroup.

Поддерживаемые Форматы и Загрузчики

Обратите внимание, что не все форматы моделей включают анимацию (OBJ, например, не включает), и что только некоторые загрузчики «Вердж3Д» поддерживают последовательности AnimationClip. Некоторые из них поддерживают этот тип анимации:

Обратите внимание, что 3ds max и Майя в настоящее время не могут экспортировать несколько анимаций (имеется в виду анимации, которые не находятся на одной временной шкале) непосредственно в один файл.

Пример

var mesh; // Create an AnimationMixer, and get the list of AnimationClip instances var mixer = new v3d.AnimationMixer(mesh); var clips = mesh.animations; // Update the mixer on each frame function update () { mixer.update(deltaSeconds); } // Play a specific animation var clip = v3d.AnimationClip.findByName(clips, 'dance'); var action = mixer.clipAction(clip); action.play(); // Play all animations clips.forEach(function(clip) { mixer.clipAction(clip).play(); });