KeyframeTrack

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

Обзор различных элементов системы анимации Verge3D смотрите в статье "Animation System" в разделе "Next Steps" руководства.

В KeyframeTrack всегда есть два массива: массив times хранит значения времени для всех ключевых кадров этого трека в последовательном порядке, а массив values values содержит соответствующие изменяющиеся значения анимированного свойства.

Одно значение, относящееся к определенному моменту времени, может быть не только простым числом, но и (например) вектором (если анимируется позиция) или кватернионом (если анимируется вращение). По этой причине массив values (который также является плоским массивом) может быть в три или четыре раза длиннее массива times.

В соответствии с различными возможными типами анимированных значений существует несколько подклассов KeyframeTrack, наследующих большинство свойств и методов:

Некоторые примеры того, как вручную создавать AnimationClip с различными видами KeyframeTracks, можно найти в файле AnimationClipCreator.

Поскольку явные значения задаются только для дискретных моментов времени, хранящихся в массиве times, все значения между ними должны быть интерполированы.

Имя дорожки важно для связи этой дорожки с определенным свойством анимированного узла (осуществляется с помощью PropertyBinding).

Конструктор

KeyframeTrack(name : String, times : Array, values : Array, interpolation : Constant)

name — идентификатор для KeyframeTrack.
times — массив времен ключевых кадров, преобразованный внутри Float32Array.
values — массив со значениями, относящимися к массиву times, преобразованный внутри Float32Array.
interpolation — тип используемой интерполяции. Возможные значения смотрите в Animation Constants. По умолчанию InterpolateLinear.

Свойства

.name : String

Имя дорожки может ссылаться на morph targets или bones или, возможно, на другие значения внутри анимированного объекта. Формы строк, которые могут быть разобраны для привязки свойств, см. в PropertyBinding.parseTrackName:

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

Обычно после ноды непосредственно указывается свойство. Но можно указать и подсвойство, например .rotation[x], если вы хотите управлять только X-компонентой вращения через дорожку float.

Вы также можете указать кости или мультиматериалы, используя имя объекта, например: .bones[R_hand].scale; красный канал диффузного цвета четвертого материала в массиве материалов - в качестве еще одного примера - можно получить с помощью .materials[3].diffuse[r].

PropertyBinding также определяет имена целей морфа, например: .morphTargetInfluences[run].

Примечание: Название трека не обязательно должно быть уникальным. Несколько дорожек могут управлять одним и тем же свойством.Результат должен быть основан на взвешенной комбинации между несколькими дорожками в соответствии с весами их соответствующих действий.

.times : Float32Array

A Float32Array, преобразованный из массива times, который передается в конструкторе.

.values : Float32Array

A Float32Array, преобразуется из массива значений, который передается в конструкторе.

.DefaultInterpolation : Constant

Тип интерполяции по умолчанию: InterpolateLinear.

.TimeBufferType : Constant

Float32Array, тип внутреннего буфера, используемого для времен.

.ValueBufferType : Constant

Float32Array, тип внутреннего буфера, используемого для значений.

Методы

.clone() → KeyframeTrack

Возвращает копию этого трека.

.createInterpolant() → null

Создает LinearInterpolant, CubicInterpolant или DiscreteInterpolant, в зависимости от значения параметра интерполяции, переданного в конструкторе.

.getInterpolation() → null

Возвращает интерполяционный тип.

.getValueSize() → Number

Возвращает размер каждого значения (то есть длину массива values values, деленную на длину массива times).

.InterpolantFactoryMethodDiscrete(result) → DiscreteInterpolant

Создает новый DiscreteInterpolant из times и values. Может быть передан массив Float32Array, который получит результаты. В противном случае будет автоматически создан новый массив соответствующего размера.

.InterpolantFactoryMethodLinear(result) → null

Создает новый LinearInterpolant из times и values. Может быть передан массив Float32Array, который получит результаты. В противном случае будет автоматически создан новый массив соответствующего размера.

.InterpolantFactoryMethodSmooth(result) → null

Создает новый CubicInterpolant из times и values. Может быть передан массив Float32Array, который получит результаты. В противном случае будет автоматически создан новый массив соответствующего размера.

.optimize() → this

Удаляет эквивалентные последовательные ключи, которые часто встречаются в целевых последовательностях морфа.

.scale() → this

Масштабирует время всех ключевых кадров на коэффициент.

Примечание: Полезно, например, для преобразования к определенной частоте кадров в секунды (как это делается внутри animationClip.CreateFromMorphTargetSequence).

.setInterpolation(interpolationType : Constant) → this

Устанавливает тип интерполяции. Варианты выбора смотрите в Animation Constants.

.shift(timeOffsetInSeconds : Number) → this

Перемещает все ключевые кадры вперед или назад по времени.

.trim(startTimeInSeconds : Number, endTimeInSeconds : Number) → this

Удаляет ключевые кадры до startTime и после endTime, не изменяя никаких значений в диапазоне [startTime, endTime].

.validate() → Boolean

Выполняет минимальную валидацию дорожек. Возвращает true, если они валидны.

Этот метод регистрирует ошибки в консоли, если дорожка пуста, если размер значения .valueSize не действителен, если элемент в массиве times или values values не является действительным числом или если элементы в массиве times расположены не по порядку.

Исходный файл

О том как получить исходный код этого модуля читайте тут.