Position в связке с Angle Control

p = effect("Slider Control")("Slider");
a = effect("Angle Control")("Angle");
r = degreesToRadians(a-90);
x = p*Math.cos(r);
y = p*Math.sin(r);
value + [x,y]

Auto-Orient Along Path

try{
cornerEase = 3;
p = transform.position;
t = Math.min(Math.max(time,p.key(1).time+.001),p.key(p.numKeys).time);
pre = position.valueAtTime(t-thisComp.frameDuration*cornerEase);
post = position.valueAtTime(t+thisComp.frameDuration*cornerEase);
delta = post-pre;
orient = radiansToDegrees(Math.atan2(delta[0],-delta[1]));
value+orient+180
}catch(err){
value
}

Анимация по маркерам

keyStart и keyStartN - это ключи начала анимации.  keyEnd - ключ начала конечной анимации.

try{
if(marker.numKeys>1&&numKeys>1){
beginAnim=marker.key(1).time;
endAnim=marker.key(2).time;
markerMoveTime=endAnim-beginAnim;

//Ключи для стартовой анимации
keyStart=key(1).time;
keyStartN=key(2).time;

//Ключи для концовки
keyEnd=key(3).time;
if(time>=beginAnim && time<=endAnim)
{if((time-beginAnim)>=(keyStartN-keyStart)){valueAtTime(keyStartN);}
else valueAtTime(keyStart+(time-beginAnim));
}
else if(time>endAnim)
{valueAtTime(keyEnd+(time-endAnim));}
else if(time<beginAnim) {valueAtTime(keyStart);}
else {value;}
}else value;
}catch(err){value;}

startValue endValue

duration = 1; // продолжительность анимации в секундах
startVal = 0; // начальное значение
endVal = 100; // финальное значение
endTime = inPoint+duration;
Math.round(linear(time,inPoint,endTime,startVal,endVal))

Look At

Target = thisComp.layer("Target");
delta = thisLayer.toComp([0,0]) - Target.toComp([0,0]);
radiansToDegrees(Math.atan2(delta[1],delta[0]))+180

Ограничение дистанции

Применяется для параметра Position. 2D.

centre=thisComp.layer("Centre");
radius = 512; // Максимальная дистанция
x0=value[0]-centre.transform.position[0];
y0=value[1]-centre.transform.position[1];
distance0 = Math.sqrt(x0*x0+y0*y0);
distance = Math.min(distance0,radius);
if (distance0>radius){
distance_mult = distance/distance0;
}else{
distance_mult = 1
}
x=centre.transform.position[0]+distance_mult*x0;
y=centre.transform.position[1]+distance_mult*y0;
[x,y]

3D

centre=thisComp.layer("Orbit");
radius = 505;
x0=value[0]-centre.transform.position[0];
y0=value[1]-centre.transform.position[1];
z0=value[2]-centre.transform.position[2];
distance0 = Math.sqrt(x0*x0+y0*y0+z0*z0);
distance = Math.min(distance0,radius);
if (distance0>radius){
distance_mult = distance/distance0;
}else{
distance_mult = 1
}
x=centre.transform.position[0]+distance_mult*x0;
y=centre.transform.position[1]+distance_mult*y0;
z=centre.transform.position[2]+distance_mult*z0;
[x,y,z]

Pause-Start с помощью маркера

Выражение позволяет делать паузы на футаже или композиции с помощью маркеров. Маркер ставится нажатием звездочки (*) на клавиатуре. Первый маркер делает паузу, второй - запускает время, третий снова ставит паузу итд. Т.е. пауза будет между двумя маркерами. Используется для параметра Time Remap

n = 0;
if (thisLayer.marker.numKeys > 0){
n = thisLayer.marker.nearestKey(time).index;
if (thisLayer.marker.key(n).time > time){
n--;
}
}

if (n > 0){
if (n%2){
t = 0;
}else{
t = time - thisLayer.marker.key(n).time;
n--;
}
while (n > 0){
t1 = thisLayer.marker.key(n).time;
t0 = (n > 1) ? thisLayer.marker.key(n-1).time : 0;
t += t1 - t0;
n -= 2;
}
}else{
t = time;
}
t

Вычисление ширины текста

text

Выражение позволяет вычислить габариты текста. Может пригодится для создания подложки, которая будет автоматически изменять свой размер, в зависимости от ширины текста. Не работает в версиях ниже CC 2014!

title = thisComp.layer("Text Layer") ; // Текстовый слой
indW = 10; // Отступ по ширине
indH = 10; // Отступ по высоте
rect = title.sourceRectAtTime(time,false);
x = rect.width+indW;
y=rect.height+indH;
[x,y]

Эффект лупы

Выражение сдвигает увеличенный слой так, как если бы он находился под "виртуальной лупой". Применяется для параметра Position.

loupe = Zoom Centre; // Слой, который играет роль лупы
big = thisLayer;
bigS = transform.scale;
small = thisComp;
ratioW = (big.width/(100/bigS[0]))/small.width;
ratioH = (big.height/(100/bigS[1]))/small.height;
p = loupe.transform.position-[thisComp.width,thisComp.height]/2;
value-[p[0]*ratioW,p[1]*ratioH]+p

Один размер 3д-слоя, независимо от расстояния до камеры

Если применить это выражение к параметру Scale 3D-слоя, то при удалении от камеры или зуме, слой будет автоматически увеличиваться, зрительно не меняя свой размер.

cam = thisComp.activeCamera;
distance = length(sub(position, cam.position));
scale * distance / cam.zoom;

Набор текста с мигающим курсором

Выражение создаёт анимацию набора текста с мигающим курсором. Применяется для параметра Source Text текстового слоя.

Speed = 10; // Скорость набора текста
Blink = 2; // Скорость мигания курсора
CursorType = "|" // Тип курсора. Обычно это вертикальная линия  "|"  или нижний прочерк  "_"

F = Math.round(time*Blink % 1);
L = text.sourceText.length;
T = (time - thisLayer.inPoint)*Speed;
if(F ==1 | (T<L & T>0) ){Fl=CursorType;}else{Fl="";}
substr(0,T) + Fl

Прозрачность 3D-слоя в зависимости от угла камеры

ugol_1

Применяется к параметру Opacity, хотя можно применить практически к любому параметру, нужно изменить значение в строках endVal и startVal. Например чтобы слой менял размер, нужно прописать значения [X,Y]. Пример: endVal = [100,100]; startVal= [150,150];

endVal = 100; // Значение если слой лицом к камере
startVal = 0; // Значение если слой под углом
fadeAngle = 90; // Угол камеры, при котором будет значение установленное в endVal
v = toCompVec([0,0,1]);
d = length(toWorld(anchorPoint),thisComp.activeCamera.toWorld([0,0,0]));
c = v[2]/d;
ease(c,Math.cos(degreesToRadians(fadeAngle)),1.0,startVal,endVal)

Кинетическая типографика

animate

Чтобы использовать выражение, нужно в текстовом слое создать аниматор с любой трансформацией (Animate:>) и добавить к нему (Add:>) Expression Selector. Выражение нужно вставить в параметр Amount селектора.

delay = 0.03; // Задержка
freq = 3; // Частота
amp = 60; // Амплитуда
decay = 10; // Чем меньше значение, тем больше колебаний
Speed = 0.8; // Чем меньше значение, тем медленнее анимация

myDelay = delay*textIndex;
t = (time - inPoint)*Speed - myDelay;
if (t >= 0){
freq;
amp;
decay;
s = amp*Math.cos(freq*t*2*Math.PI)/Math.exp(decay*t);
[s,s] }else{
value
}

Разделение между цифрами

Выражение позволяет разделять длинные числа пробелами или, например, точками. Пример: число 1000000000, с помощью данного выражения будет отображаться так - 1.000.000.000 . Используется для Source Text текстового слоя, связанного с эффектом Slider Control.

var num = effect("Slider Control")("Slider");
sym = '.'; // Символ, который будет разделять числа, можно поставить пробел
wordL = "$"; // Слово до
wordR = " "; //  Слово после
dig = 3; // Количество цифр, после которых будет разделитель

num =wordL+ Comma(num) + wordR;
[num]
function Comma(number)
{
number = '' + Math.round(number);
if (number.length > dig)
{
var mod = number.length % dig;
var output = (mod > 0 ? (number.substring(0,mod)) : '');
for (i=0 ; i < Math.floor(number.length / dig); i++)
{
if ((mod == 0) && (i == 0))
output += number.substring(mod+ dig * i, mod + dig * i + dig);
else
output+= sym + number.substring(mod + dig * i, mod + dig * i + dig);
}
return (output);
}
else return number;
}

Expression в текстовом поле

С помощью этого выражения, можно использовать любые другие выражения записанные в текстовом слое.

try{
TextLayer = Text; // Текстовый слой, в котором будут прописаны выражения
expr = String(TextLayer.text.sourceText);
eval(expr)
}
catch(err){value}

Значения слайдера в текст

Выражение позволяет перенести цифры эффекта Slider Control в текстовый слой. Дополнительно можно добавить слова до и после числа, например поставить знак «$» перед числом, или «%» после.

temp=0+effect("Slider Control")("Slider");
wordL = " "; // Слово до
wordR = " "; //  Слово после
dig = 1; // Цифр после запятой
""+ (wordL)+temp.toFixed(dig)+""+ (wordR)

Рандомный кадр в Time Remapping

Выражение рандомно отображает кадры футажа. Применяется для параметра Time Remapping

fr = 5; // Частота кадров, если поставить 0 (ноль), то будет отображен один замороженный кадр;
numFrames = 15; // Количество кадров из секвенции, которые будут использоваться
seedRandom(index,true);
seg = Math.floor(time*fr);
f = Math.floor(random(numFrames));
for (i = 0; i < seg; i++)
f = (f + Math.floor(random(1,numFrames)))%numFrames;
framesToTime(f);

3D-слой всегда под одним углом к камере

С помощью этого выражения 3D-слой будет всегда под одним углом к положению камеры, без каких-либо поворотов и искажений, как это бывает если использовать авто-ориентацию по камере. Применяется для параметра Orientation.

try{
L = thisComp.activeCamera;
u = fromWorldVec(L.toWorldVec([1,0,0]));
v = fromWorldVec(L.toWorldVec([0,1,0]));
w = normalize(fromWorldVec(L.toWorldVec([0,0,1])));

sinb = clamp(w[0],-1,1);
b = Math.asin(sinb);
cosb = Math.cos(b);
if (Math.abs(cosb) > .0005){
c = -Math.atan2(v[0],u[0]);
a = -Math.atan2(w[1],w[2]);
}else{
a = (sinb < 0 ? -1 : 1)*Math.atan2(u[1],v[1]);
c = 0;
}
[radiansToDegrees(a),radiansToDegrees(b),radiansToDegrees(c)]
}catch(err){
value
}

Чекбокс

Привязка параметров к эффекту Checkbox Control.

checker = effect("Checkbox Control")("Checkbox");
on = 100; // Значение если Вкл.
off = 0; // Значение если Выкл.
if(checker==1) {on} else {off};

Текст из маркера в Текстовом слое

С помощью этого выражения, текст в маркере будет дублироваться в текстовом слое. Выражение нужно вставить в параметр Source Text текстового слоя.

m = thisComp.layer("Text Source");
n=0;
if (m.marker.numKeys > 0){
n = m.marker.nearestKey(time).index;
if (m.marker.key(n).time > time) n--;
}

if (n > 0) m.marker.key(n).comment else  ""

Фэйд по маркерам

Выражение позволяет анимировать параметр Opacity таким образом, чтобы на маркере прозрачность плавно уменьшалась до нуля, а на следующем маркере плавно увеличивалась до 100%. Сдвигая маркеры анимация прозрачности сдвинется вместе с ними. Таким образом можно расставить любое количество маркеров и анимировать фэйды без использования ключей. Чтобы поставить маркер на слое, нужно нажать кнопку [*] знак умножения.

if (marker.numKeys > 0){ m = marker.nearestKey(time);
frIn = 5; // Длительность появления в кадрах
frOut = 15; // Длительность исчезания в кадрах
t = m.time;
if (m.index%2){ ease(time,t,t+frOut*thisComp.frameDuration,100,0) }else{ ease(time,t,t+frIn*thisComp.frameDuration,0,100) } }else{ value }

Зацикленный Wiggle

freq = 1; // Частота
amp = 110; // Амплитуда
loopTime = 3; // Длительность цикла в секундах
t = time % loopTime;
wiggle1 = wiggle(freq, amp, 1, 0.5, t);
wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopTime);
linear(t, 0,  loopTime, wiggle1, wiggle2)

Start typing and press Enter to search