Выражения. Свойство frameDuration в After Effects
Свойство frameDuration в After Effects используется в выражениях для получения длительности одного кадра в текущей композиции (в секундах). Это полезно, когда нужно синхронизировать анимацию с частотой кадров или создать эффекты, зависящие от времени кадра.
Список эффектов и не только After Effects
Выражения After Effects список
thisComp.frameDuration гарантирует, что выражения будут работать одинаково при разных частотах кадров (например, 24 fps, 30 fps или 60 fps).
Удобно для точной привязки анимации к кадрам, а не к абсолютному времени.
Полезно для создания стробированных эффектов, точного контроля времени и синхронизации.
// Для свойства Rotation:
Rotation = time * (30 / thisComp.frameDuration); // Поворот на 30° за 1 кадр, независимо от FPS композиции
// Для свойства Position (движение вправо на 5 пикселей за кадр):
Speed = 5; // Пикселей/кадр
value + [Speed * (time / thisComp.frameDuration), 0];
Получение текущего номера кадра:
// Для текстового слоя (отображение текущего кадра):
Math.floor(time / thisComp.frameDuration) + 1; // +1 для отсчёта с 1
Допустим, вы хотите, чтобы значение свойства (например, позиция или вращение) увеличивалось с каждым кадром.
value + timeToFrames(time) * thisComp.frameDuration * 10; // Для масштаба
value + timeToFrames(time) * thisComp.frameDuration * 30; // Для поворота
value + timeToFrames(time) * thisComp.frameDuration * 50; // Для позиции
timeToFrames(time) возвращает текущий кадр.
Умножение на thisComp.frameDuration позволяет привязать изменение к длительности кадра.
value — исходное значение свойства.
// Для свойства Opacity (мерцание каждые 5 кадров):
n = 5; // Интервал кадров
if (time % (n * thisComp.frameDuration) < thisComp.frameDuration) {
100;
} else {
0;
}
Оператор % — это оператор деления по модулю. Он возвращает остаток от деления одного числа на другое. Этот оператор часто применяется для создания циклических или повторяющихся эффектов, а также для управления анимацией в зависимости от времени или других параметров.
Если вы хотите создать колебание (например, для свойства Scale), которое зависит от частоты кадров:
amp = 20; // Амплитуда колебания
freq = 2; // Частота колебания в секундах
Math.sin(time / thisComp.frameDuration * freq) * amp + value; // Колебания по оси Х
// Колебания по двум осям Х и Y
amp = 20; // Амплитуда колебания
freq = 2; // Частота колебания в секундах
x = Math.sin(time / thisComp.frameDuration * freq) * amp + transform.scale[0];
y = Math.sin(time / thisComp.frameDuration * freq) * amp + transform.scale[0];
[x, y];
time / thisComp.frameDuration преобразует текущее время в количество кадров.
Math.sin создает плавное колебание, а thisComp.frameDuration обеспечивает независимость от частоты кадров композиции.
thisComp.frameDuration используется для точного расчета времени задержки в кадрах
Анимация с дискретными шагами
Переключение цветов по кадрам:
// Для свойства Color:
colors = [[1,0,0,0], [0,1,0,0], [0,0,1,0]]; // Красный, Зелёный, Синий
currentFrame = Math.floor(time / thisComp.frameDuration);
colors[currentFrame % colors.length];
Допустим, вы хотите, чтобы анимация длилась ровно 24 кадра, независимо от частоты кадров композиции:
cycleFrames = 24; // Длина цикла в кадрах
cycleTime = cycleFrames * thisComp.frameDuration; // Длина цикла в секундах
t = time % cycleTime; // Остаток времени в цикле
linear(t, 0, cycleTime, 0, 360); // Пример вращения от 0 до 360
frameDuration помогает рассчитать длительность цикла в секундах.
time % cycleTime создает повторяющийся цикл.