AnimationAction - Руководство по Вердж3Д - Софт Эйт Софт
Description: Узнайте как использовать AnimationAction в интерактивных 3Д-веб-приложениях сделанных на Вердж3Д

# AnimationAction

AnimationAction планируют выполнение анимаций, которые хранятся в AnimationClips.

Большинство методов AnimationAction можно объединять в цепочку.

Обзор элементов анимационной системы «Вердж3Д» находится в разделе Анимационная система настоящего руководства.

## Конструктор

### AnimationAction(mixer : AnimationMixer, clip : AnimationClip, localRoot : Object3D)

- mixer — `AnimationMixer`, который управляется этим действием.
- clip — `AnimationClip`, который содержит данные анимации для этого действия.
- localRoot — корневой объект, над которым выполняется это действие.
- blendMode — определяет как анимация смешивается/соединяется, когда две или более анимаций проигрываются одновременно.

Вместо прямого вызова этого конструктора следует создать AnimationAction с помощью функции AnimationMixer.clipAction, поскольку этот метод обеспечивает кэширование для повышения производительности.

## Свойства

### # .blendMode : Integer

Определяет как анимация смешивается/соединяется, когда две или более анимаций проигрываются одновременно. Допустимые значения: `NormalAnimationBlendMode` (по умолчанию) и `AdditiveAnimationBlendMode`.

### # .clampWhenFinished : Boolean

Если `clampWhenFinished` имеет значение `true`, анимация будет автоматически поставлена на паузу на последнем кадре.

Если `clampWhenFinished` установлено в `false`, свойство enabled будет автоматически переключено в `false` после завершения последнего цикла действия, так что это действие не будет иметь дальнейшего влияния.

Значение по умолчанию — `true`.

`clampWhenFinished` не имеет никакого влияния, если действие прервано (оно имеет эффект только в том случае, если его последний цикл действительно завершился).

### # .enabled : Boolean

Установка `enabled` в `false` отключает действие, так чтобы оно не оказывало влияния влияния. По умолчанию `true`.

Когда действие снова включено, анимация продолжается с текущего времени (установка `enabled` в `false` не сбрасывает действие).

Установка значения `enabled` в `true` не приводит к автоматическому перезапуску анимации. Установка `enabled` в `true` немедленно перезапустит анимацию, только если выполняется следующее условие: paused равно `false`, это действие не было деактивировано (выполнением команды stop или reset), и ни weight, ни timeScale не равны `0`.

### # .loop : Integer

Режим зацикливания (можно изменить с помощью setLoop). По умолчанию v3d.LoopRepeat (c бесконечным числом повторений).

Должен быть одной из этих констант:

- v3d.LoopOnce — воспроизведение клипа один раз
- v3d.LoopRepeat — воспроизведение клипа с выбранным числом `repetitions`, каждый раз переходя от конца клипа непосредственно к его началу
- v3d.LoopPingPong — воспроизведение ролика с выбранным количеством `repetitions`, поочередное воспроизведение вперед и назад

### # .paused : Boolean

Установка `paused` в `true` приостанавливает выполнение действия, устанавливая шкалу эффективного времени на `0`. По умолчанию `false`.

### # .repetitions : Integer

Количество повторений выполняемой AnimationClip в течение этого действия. Может быть задано через setLoop. По умолчанию `Infinity`.

Установка этого числа не имеет эффекта, если для параметра loop mode установлено значение v3d.LoopOnce.

### # .time : Float

Локальное время этого действия (в секундах, начиная с `0`).

Значение обрезается или оборачивается до `0...clip.duration` (в зависимости от состояния цикла). Оно может быть масштабировано относительно глобального микшера времени путем изменения timeScale (с помощью setEffectiveTimeScale или setDuration).

### # .timeScale : Float

Коэффициент масштабирования для time. При значении `0` анимация приостанавливается. Отрицательные значения заставляют анимацию воспроизводиться в обратном направлении. По умолчанию используется значение `1`.

Свойствами/методами, относящимися к `timeScale` (соответственно `time`), являются: getEffectiveTimeScale, halt, paused, setDuration, setEffectiveTimeScale, stopWarping, syncWith, warp.

### # .timeStart : Float

Локальное время начала этого действия (в секундах). Используйте вместе с AnimationClip.duration для установки диапазона воспроизведения.

### # .weight : Float

Степень влияния данного действия (в интервале `[0, 1]`). Значения от `0` (нет влияния) до `1` (полное влияние) могут использоваться для смешивания нескольких действий. По умолчанию - `1`.

Свойствами/методами, относящимися к `weight`, являются: crossFadeFrom, crossFadeTo, enabled, fadeIn, fadeOut, getEffectiveWeight, setEffectiveWeight, stopFading.

### # .zeroSlopeAtEnd : Boolean

Включает плавную интерполяцию без отдельных клипов для начала, цикла и конца. По умолчанию `true`.

### # .zeroSlopeAtStart : Boolean

Включает плавную интерполяцию без отдельных клипов для начала, цикла и конца. По умолчанию `true`.

## Методы

### # .crossFadeFrom(fadeOutAction : AnimationAction, durationInSeconds : Float, warpBoolean : Boolean) → this

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

Если `warpBoolean` равен `true`, будет применён дополнительный warping (постепенное изменение временных масштабов).

Как и в случае `fadeIn`/`fadeOut`, затухание начинается/заканчивается с весом `1`.

### # .crossFadeTo(fadeInAction : AnimationAction, durationInSeconds : Float, warpBoolean : Boolean) → this

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

Если `warpBoolean` равен `true`, будет применён дополнительный warping (постепенное изменение временных масштабов).

Как и в случае `fadeIn`/`fadeOut`, затухание начинается/заканчивается с весом `1`.

### # .fadeIn(durationInSeconds : Float) → this

Увеличивает weight этого действия постепенно от `0` до `1`, в течение заданного интервала времени. Этот метод можно объединить в цепочку.

### # .fadeOut(durationInSeconds : Float) → this

Уменьшает weight этого действия постепенно от `1` до `0`, в течение заданного интервала времени. Этот метод можно объединить в цепочку.

### # .getEffectiveTimeScale() → Float

Возвращает эффективную шкалу времени (учитывая текущие состояния искривления и paused).

### # .getEffectiveWeight() → number

Возвращает эффективный вес (с учетом текущих состояний затухания и enabled).

### # .getClip() → AnimationClip

Возвращает клип, содержащий данные анимации для этого действия.

### # .getMixer() → AnimationMixer

Возвращает микшер, который отвечает за воспроизведение этого действия.

### # .getRoot() → Object3D

Возвращает корневой объект, над которым выполняется данное действие.

### # .halt(durationInSeconds : Float) → this

Замедляет скорость этой анимации до 0, постепенно уменьшая timeScale (начиная с его текущего значения) в течение переданного интервала времени. Этот метод может быть соединен в цепочку.

### # .isRunning() → Boolean

Возвращает `true`, если действие time в данный момент выполняется.

Помимо активации в микшере (смотрите isScheduled) должны выполняться следующие условия: paused равно false, enabled равно true, timeScale не равно 0, и нет планирования для отложенного старта (startAt).

Если `isRuning` равно `true`, это не обязательно означает, что анимацию можно увидеть. Это происходит только в том случае, если weight дополнительно имеет ненулевое значение.

### # .isScheduled() → Boolean

Возвращает `true`, если это действие активировано в микшере.

Это не обязательно означает, что анимация действительно запущена (сравните дополнительные условия для isRunning).

### # .play() → this

Приказывает микшеру активировать действие. Этот метод может быть соединен в цепочку.

Активация этого действия не обязательно означает, что анимация начнется немедленно: Если действие уже завершилось ранее (дойдя до конца своего последнего цикла), или если было установлено время отложенного старта (через startAt), сначала должно быть выполнено reset. Некоторые другие настройки (paused=true, enabled=false, weight=0, timeScale=0) также могут предотвратить воспроизведение анимации.

### # .reset() → this

Сбрасывает действие. Этот метод можно объединить в цепочку.

Этот метод устанавливает paused в `false`, enabled в `true`, time в `0`, прерывает любое запланированное затухание и искривление, и удаляет внутренний счетчик циклов и планирование для отложенного запуска.

.reset всегда вызывается stop, но `.reset` не вызывает сам `.stop`. Это означает: если вам необходимы и сброс, и остановка одновременно — не вызывайте `.reset`; вместо этого вызовите `.stop`.

### # .setDuration(durationInSeconds : Float) → this

Устанавливает продолжительность одного цикла этого действия (регулируя timeScale и останавливая любое запланированное искривление). Этот метод может быть соединен в цепочку.

### # .setEffectiveTimeScale(timeScale : Float) → this

Устанавливает timeScale и останавливает любое запланированное искривление. Этот метод может быть соединен в цепочку.

Если paused равно false, шкала эффективного времени (внутреннее свойство) также будет установлена в это значение; в противном случае шкала эффективного времени (непосредственно влияющая на анимацию в данный момент) будет установлена в 0.

.paused не будет автоматически переключен на `true`, если `.timeScale` установлен в `0` этим методом.

### # .setEffectiveWeight(weight : Float) → this

Устанавливает вес weight и останавливает любое запланированное затухание. Этот метод можно объединить в цепочку.

Если enabled равно true, эффективный вес (внутреннее свойство) также будет установлен этому значению; в противном случае эффективный вес (непосредственно влияющий на анимацию в данный момент) будет установлен в `0`.

.enabled не будет автоматически переключен на `false`, если `.weight` установлен в `0` этим методом.

### # .setLoop(loopMode : Integer, repetitions : Integer) → this

Устанавливает режим loop и количество повторений repetitions. Этот метод можно объединить в цепочку.

### # .startAt(startTimeInSeconds : Float) → this

Определяет время отложенного старта (обычно передается как AnimationMixer.time + deltaTimeInSeconds). Этот метод может быть соединен в цепочку.

Анимация начнется только в указанное время, если `.startAt` связан цепочкой с play, или если действие уже было активировано в микшере (предыдущим вызовом `.play`, без остановки или сброса в это время).

### # .stop() → this

Сообщает микшеру о необходимости деактивировать это действие. Этот метод может быть соединен в цепочку.

Действие будет немедленно остановлено и полностью сброшено.

Вы можете остановить все активные действия на одном микшере за один раз с помощью mixer.stopAllAction.

### # .stopFading() → this

Останавливает все запланированные fading, которые применяются к этому действию. Этот метод может быть цепочкой.

### # .stopWarping() → this

Останавливает любое запланированное warping, которое применяется к этому действию. Этот метод может быть цепочкой.

### # .syncWith(otherAction : AnimationAction) → this

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

Синхронизация выполняется путем установки значений time и timeScale этого действия на соответствующие значения другого действия (останавливая любое запланированное искривление).

Примечание: Будущие изменения `time` и `timeScale` другого действия не будут обнаружены.

### # .warp(startTimeScale : Float, endTimeScale : Float, durationInSeconds : Float) → this

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

## События

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

`mixer.addEventListener('loop', function(e) { …}); // properties of e: type, action and loopDelta mixer.addEventListener('finished', function(e) { …}); // properties of e: type, action and direction`

## Пазлы

Вместо вызовов АПИ AnimationAction вы можете использовать анимационные пазлы.

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

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