Подборка экспрешнов для After Effects
Собрал список выражений для Аfter Effects, которые упрощают мою работу. Совсем простых в стиле
Своих экспрешнов здесь всего несколько. Большинство я взял из интернета и немного адаптировал под себя. Так что там где уместно, я указал ссылки на авторов.
Динамическая рамка для текста
Плашка, которая автоматически подстраивается под длину текста.
Создайте прямоугольный
Примените экспрешн к параметру
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]
Если текст в несколько строк, то добавьте ещё этот экспрешн к
x = value[0];
y = content("Rectangle 1").content("Rectangle Path 1").size[1]/2;
[x,y]
Анимируемый wiggle
Простой способ анимировать wiggle с помощью двух слайдеров: первый отвечает за частоту, второй за амплитуду. Лучше анимировать только амплитуду.
Добавьте эффект
Примените экспрешн к нужному параметру:
w_freq = effect("Slider Control")("Slider");
w_amplitude = effect("Slider Control 2")("Slider");
wiggle(w_freq,w_amplitude)
Цикличный wiggle
Благодаря этому экспрешну, wiggle начинается и заканчивается в одной и той же точке.
Если вдруг цикл не работает, то это скорей всего из-за того, что луп не успевает прийти в изначальное состояние за отведённое время. Просто увеличьте
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)
Прикрепить шейп к одной стороне
Фиксирует одну сторону шейпа на месте, когда вы меняете
Примените к
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]
Риг для катящегося круга и квадрата
Катящийся круг
Примените к
transform.position[0]-(content("Ellipse 1").content("Ellipse Path 1").size[0]/2)-transform.position[0]/2
Катящийся квадрат
Работает как с шейпами, так и со слоями и композициями.
Примените экспрешн к
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
Ступенчатые повороты
Альтернатива
Примените к
angle = 15; // Угол поворота в секунду
rotateDuration = 10; // Длительность поворота в кадрах
rotateDurationFr = rotateDuration/(1/thisComp.frameDuration);
wholeSecond = Math.floor(time);
startAngle = wholeSecond * angle;
ease(time, wholeSecond, wholeSecond + rotateDurationFr, startAngle, startAngle + angle)
Продвинутые ступенчатые повороты
Практически то же самое, что и выше. Но с чуть большим количеством настроек.
Примените к
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;
}
Постоянный масштаб при скейле
Когда вы привязываете один объект к другому и масштабируете родительский, оба слоя увеличиваются. Этот экспрешн не позволяет дочернему слою менять масштаб и только перемещает его по позиции.
Примените к
s = [];
ps = parent.transform.scale.value;
for (i = 0; i < ps.length; i++){
s[i] = value[i]*100/ps[i];
}
s
Переключатель по чекбоксу
Меняет одно значение параметра на другое по нажатию на чекбокс.
Добавьте эффект
if (effect("Checkbox Control")(1) == 0) 0 else 100
Луп для шейпов
Обычный
Примените к
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)
Range Mapper
Преобразует значения из одного диапазона в другой.
Добавьте
input = effect("Slider Control")("Slider");
inputLow = 0;
inputHigh = 100;
outputLow = 466;
outputHigh = 618;
linear(input,inputLow,inputHigh,outputLow,outputHigh)
Обводка независимая от скейла
Сохраняет постоянную обводку у шейпов при изменении масштаба.
Примените к
value / length(toComp([0,0]), toComp([0.7071,0.7071])) || 0.001;
Счётчики
Подборка из 6 экспрешнов для создания различных счётчиков. По сути, все эти счётчики представляют собой текст, привязанный к
1. Обычный счётчик
Счётчик с фиксированным количеством десятичных знаков.
Добавьте эффект
parseFloat(effect("Slider Control")("Slider")).toFixed(2)
2. Счётчик с запятыми вместо точек
Заменяет точку для десятичных знаков на запятую. Если нужен похожий сетап с большим количеством настроек, то он вот здесь.
Добавьте
c = parseFloat(effect("Slider Control")("Slider")).toFixed(2);
c.toString().replace(".", ",")
3. Счётчик с дополнительными знаками
Добавляет любые дополнительные символы в начале или конце счётчика.
Добавьте
"+"+parseFloat(effect("Slider Control")("Slider")).toFixed(2)+"%"
4. Счётчик с нулями в начале
Превращает числа из
Добавьте
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. Счётчик с разрядами
Группирует цифры по разрядам, превращая
Добавьте
num = parseFloat(effect("Slider Control")("Slider")).toFixed(0);
str = isNaN(num) ? "" : (num * 1 + "");
str.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');
6. Счётчик для больших чисел
Счётчик, привязанный к
Добавьте
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;
Мини-экспрешны
И, под конец, 4 полезных мини-выражения, которые часто пригождаются.
1. Привязка к слою выше или ниже
Это не полноценный экспрешн, а только его часть. Вместо того, чтобы привязывать один слой к другому напрямую, иногда удобнее динамически привязывать к слою, который стоит выше или ниже слоя с экспрешном.
В примере, я привязываю позицию у слоя с шейпом к любому слою, который стоит выше на таймлайне. Если нужна привязка к слою ниже, то используйте
thisComp.layer(index-1)
2. Постоянно ускоряющиеся повороты
Добавьте это к
time*time*time*time
3. Ключи для time*n
Добавляет постоянное движение, но оставляет возможность ставить ключи.
value+time*11
4. Привязка градиента к слою
Чтобы
toComp(value)
Это все выражения, которыми я пользуюсь на постоянной основе. Всего получилось 23.
📁 Проект со всеми экспрешнами, который вы можете скачать бесплатно.