Rose debug info
---------------

Подборка экспрешнов для After Effects

Собрал список выражений для Аfter Effects, которые упрощают мою работу. Совсем простых в стиле loopOut() или wiggle (.4,6) здесь нет, но и ничего слишком сложного тоже.

Своих экспрешнов здесь всего несколько. Большинство я взял из интернета и немного адаптировал под себя. Так что там где уместно, я указал ссылки на авторов.

Динамическая рамка для текста

Плашка, которая автоматически подстраивается под длину текста.

Создайте прямоугольный Shape Layer и сверху отдельным слоем добавьте текст.
Примените экспрешн к параметру Size у шейпа:

margin_width = 60;
margin_height = 40;

text_width = thisComp.layer(index-1).sourceRectAtTime().width;
text_height = thisComp.layer(index-1).sourceRectAtTime().height;

box_width = text_width + margin_width*2;
box_height = text_height + margin_height*2;

[box_width, box_height]

© Kalleheikki Kannisto

Если текст в несколько строк, то добавьте ещё этот экспрешн к Position у шейпа:

x = value[0];
y = content("Rectangle 1").content("Rectangle Path 1").size[1]/2;
[x,y]

Анимируемый wiggle

Простой способ анимировать wiggle с помощью двух слайдеров: первый отвечает за частоту, второй за амплитуду. Лучше анимировать только амплитуду.

Добавьте эффект Slider Control на слой с экспрешном и продублируйте его.
Примените экспрешн к нужному параметру:

w_freq = effect("Slider Control")("Slider");
w_amplitude = effect("Slider Control 2")("Slider");

wiggle(w_freq,w_amplitude)

Цикличный wiggle

Благодаря этому экспрешну, wiggle начинается и заканчивается в одной и той же точке.

Если вдруг цикл не работает, то это скорей всего из-за того, что луп не успевает прийти в изначальное состояние за отведённое время. Просто увеличьте loopTime или freq.

freq = 1;
amp = 65;

startTime = 0; // На какой секунде начинается луп
loopTime = 3; // Сколько секунд идёт

t = (time+startTime) % loopTime;
wiggle1 = wiggle(freq, amp, 1, 0.5, t);
wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopTime);

linear(t, 0, loopTime, wiggle1, wiggle2)

© Dan Ebberts

Прикрепить шейп к одной стороне

Фиксирует одну сторону шейпа на месте, когда вы меняете Size.

Примените к Position у шейпа:

stickTo = "left"; // top, bottom, right or left
chosenShape = content("Rectangle 1").content("Rectangle Path 1");

if (stickTo == "top"){
     x = chosenShape.position[0];
     y = chosenShape.position[1]+chosenShape.size[1]/2;
}

else if (stickTo == "bottom"){
     x = chosenShape.position[0];
     y = chosenShape.position[1]-chosenShape.size[1]/2;
}

else if (stickTo == "right"){
     x = chosenShape.position[0]-chosenShape.size[0]/2
     y = chosenShape.position[1]
}

else if (stickTo == "left"){
     x = chosenShape.position[0]+chosenShape.size[0]/2;
     y = chosenShape.position[1]
}

[x,y]

Риг для катящегося круга и квадрата

Катящийся круг

Примените к Rotation и анимируйте Position:

transform.position[0]-(content("Ellipse 1").content("Ellipse Path 1").size[0]/2)-transform.position[0]/2

Катящийся квадрат

Работает как с шейпами, так и со слоями и композициями.

Примените экспрешн к Position. Добавьте Slider Control на этот же слой. Анимируйте Rotation. Если квадрат катится неправильно, измените значение у Slider Control.

targetLayer = thisLayer;
squareSize = targetLayer.sourceRectAtTime().width;
squareDiag = (Math.sqrt(2)*squareSize)/2/3.5;

try{
	squareOffset = effect("Slider Control")("Slider");
}

catch(err) {
    squareOffset = 0;
}


rot=transform.rotation;
scl=transform.scale[0]/100;
w=(squareSize/2)*scl;
r=(degreesToRadians(rot))*2;
t=transform.position;

[t[0]+w*rot/45,t[1]-(Math.abs((squareDiag+squareOffset)*Math.sin(r)))*scl];

На основе экспрешна от Mikey Borup

Ступенчатые повороты

Альтернатива time*n. Только вместо плавного вращения создаются ступенчатые движения. Отлично подходит для анимации стрелок часов, шестерёнок и других похожих механизмов.

Примените к Rotation:

angle = 15; // Угол поворота в секунду
rotateDuration = 10; // Длительность поворота в кадрах

rotateDurationFr = rotateDuration/(1/thisComp.frameDuration);

wholeSecond = Math.floor(time);
startAngle = wholeSecond * angle;
ease(time, wholeSecond, wholeSecond + rotateDurationFr, startAngle, startAngle + angle)

© Xinlai Ni

Продвинутые ступенчатые повороты

Практически то же самое, что и выше. Но с чуть большим количеством настроек.

Примените к Rotation:

angle = 15; // Угол поворота
rotateDuration = 6; // Длительность поворота в кадрах
timeStop = 5; // Длительность остановки между поворотами
offset = 0; // Сдвиг начального положения в кадрах

fr = timeToFrames(time)+offset;

cycle = timeStop+rotateDuration;
n = Math.floor(fr/cycle);
cur_phase = fr-n*cycle;

if((cur_phase)>timeStop){
angle*n+(cur_phase-timeStop)*angle/rotateDuration;
}
else{
angle*n;
}

© aexpressions.ru

Постоянный масштаб при скейле

Когда вы привязываете один объект к другому и масштабируете родительский, оба слоя увеличиваются. Этот экспрешн не позволяет дочернему слою менять масштаб и только перемещает его по позиции.

Примените к Scale у слоя, который должен сохранять постоянный масштаб:

s = [];
ps = parent.transform.scale.value;
for (i = 0; i < ps.length; i++){
s[i] = value[i]*100/ps[i];
}
s

© JR Canest

Переключатель по чекбоксу

Меняет одно значение параметра на другое по нажатию на чекбокс.

Добавьте эффект Checkbox Control на слой с экспрешном. Примените экспрешн к любому параметру:

if (effect("Checkbox Control")(1) == 0) 0 else 100

Луп для шейпов

Обычный loopOut() не работает с шейпами, но зато работает этот экспрешн.

Примените к Path у шейпа:

try{
pingPong = false; // Поставьте true, если нужен pingPong

timeStart = thisProperty.key(1).time;
duration = thisProperty.key(thisProperty.numKeys).time-timeStart;
quant=Math.floor((time-timeStart)/duration);

if(quant<0) quant = 0

if(quant%2 == 1 && pingPong == true){
t = 2*timeStart+ (quant+1)*duration - time;
}

else{
t = time-quant*duration;
}
}
catch(err){
t = time;
}
thisProperty.valueAtTime(t)

© aexpressions.ru

Range Mapper

Преобразует значения из одного диапазона в другой.

Добавьте Slider Control на слой. Примените экспрешн к нужному параметру:

input = effect("Slider Control")("Slider");

inputLow = 0;
inputHigh = 100;
outputLow = 466;
outputHigh = 618;

linear(input,inputLow,inputHigh,outputLow,outputHigh)

© Dan Ebberts

Обводка независимая от скейла

Сохраняет постоянную обводку у шейпов при изменении масштаба.

Примените к Stroke Width:

value / length(toComp([0,0]), toComp([0.7071,0.7071])) || 0.001;

© Adam Plouff

Счётчики

Подборка из 6 экспрешнов для создания различных счётчиков. По сути, все эти счётчики представляют собой текст, привязанный к Slider Control, который можно анимировать при помощи ключей.

1. Обычный счётчик

Счётчик с фиксированным количеством десятичных знаков.

Добавьте эффект Slider Control к текстовому слою. Примените экспрешн к Source Text. Количество знаков после запятой обозначается параметром toFixed(2).

parseFloat(effect("Slider Control")("Slider")).toFixed(2)

2. Счётчик с запятыми вместо точек

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

Добавьте Slider Control на текстовый слой и примените экспрешн к Source Text.

c = parseFloat(effect("Slider Control")("Slider")).toFixed(2);
c.toString().replace(".", ",")

3. Счётчик с дополнительными знаками

Добавляет любые дополнительные символы в начале или конце счётчика.

Добавьте Slider Control на текстовый слой и примените экспрешн к Source Text.

"+"+parseFloat(effect("Slider Control")("Slider")).toFixed(2)+"%"

4. Счётчик с нулями в начале

Превращает числа из 1 в 001.

Добавьте Slider Control на текстовый слой и примените экспрешн к Source Text.

zerosAmount = 3;

var slider = effect("Slider Control")("Slider");

function padStart(string, targetLength, character) {
	string = (string instanceof String) ? string : string.toString();
	targetLength = targetLength >> 0;
	character = character || ' ';

	while (string.length < targetLength) {
		string = character + string;
	}

return string;
};

if (slider >= 0) {
zeroAmount = zerosAmount + 1;
paddedString = padStart(parseFloat(slider.value).toFixed(0), zerosAmount, '0');
}

else {
paddedString = '-0'+padStart(parseFloat(slider.value).toFixed(0)*-1, zerosAmount, '0');
}

paddedString;

На основе экспрешна от Tomas Sinkunas

5. Счётчик с разрядами

Группирует цифры по разрядам, превращая 30000 в 30 000.

Добавьте Slider Control на текстовый слой и примените экспрешн к Source Text.

num = parseFloat(effect("Slider Control")("Slider")).toFixed(0);
str = isNaN(num) ? "" : (num * 1 + "");
str.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');

© Tomas Bumbulevičius

6. Счётчик для больших чисел

Счётчик, привязанный к Slider Control, не идёт дальше 1 000 000. Поэтому если нужны большие числа, приходится использовать эффект Angle Control.

Добавьте Angle Control на текстовый слой и примените экспрешн к Source Text.

number = Math.round(effect("Angle Control")("Angle")/360);

n="" + number;
s="";
for(i=0, l=n.length; i<l;  i++){
    if(s && s!="-" && (l-i)%3 ==0)
                s+=" "; 
        s += n[i];
}
s;

© Chunk Motion

Мини-экспрешны

И, под конец, 4 полезных мини-выражения, которые часто пригождаются.

1. Привязка к слою выше или ниже

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

В примере, я привязываю позицию у слоя с шейпом к любому слою, который стоит выше на таймлайне. Если нужна привязка к слою ниже, то используйте index+1.

thisComp.layer(index-1)

2. Постоянно ускоряющиеся повороты

Добавьте это к Rotation, чтобы создать вращение, которое становится быстрее с каждой секундой:

time*time*time*time

3. Ключи для time*n

Добавляет постоянное движение, но оставляет возможность ставить ключи.

value+time*11

© Ben Marriott

4. Привязка градиента к слою

Чтобы Gradient Ramp не слетал при перемещении слоя, добавьте на Start и End:

toComp(value)

© aeexpressions.ru

Это все выражения, которыми я пользуюсь на постоянной основе. Всего получилось 23.
📁 Проект со всеми экспрешнами, который вы можете скачать бесплатно.

Поделиться
Отправить
Запинить
 49034   2021   after effects   expressions
11 комментариев
Александр Каплев 2021

Спасибо, бро!

Lelique knows best 2021

Вот это да! Спасибо!

Кирилл Аминов 2021

Очень полезная статья!

Бексултан Мейрамов 2021

Огромное спасибо! Годные сеттинги

Rovshan Garayev 2021

Получилось очень даже хорошо. Все экспрешены были интересны. Спасибо за подбор!

Ирина Куликова 2022

Спасибо большое!

Дмитрий 2022

Спасибо большое, это очень полезно! Особенно для новичков!

Игорь 2022

Здравствуйте возник вопрос по index. Скажите к какому параметру вы присваивали этот экспрешн?

Балыбердин Виталий 2022

Я применял его к position у слоя.

Вот так выглядел экспрешн:
thisComp.layer(index-1).transform.position

Благодаря этому, слой с экспрешном копирует позицию того слоя, который находится над ним на таймлайне.
Например, здесь Shape 03 повторяет позицию Shape 02: https://i.imgur.com/2PkxNTr.png

Игорь 2022

Спасибо большое, во многом очень помоги!

Сергей 2023

очень удобно, спасибо за труды!

Наиль Валиев 9 мес

Блин! И почему нет разбора того экспрешена, который мне нужен(