Adobe After Effects
Biblioteca de Expressões
Expressões prontas para copiar + sliders interativos que atualizam o código e a animação em tempo real. Clique em "Entendendo a expressão" para ver a explicação linha a linha.
24Expressões
9Categorias
↕Sliders interativos
Motion
Wiggle
Aplica movimento aleatório orgânico a qualquer propriedade. Baseado em ruído de Perlin — nunca se repete exatamente.
Entendendo a expressão
3 conceitos
freq = 2
Frequência: quantas oscilações por segundo. 0.5 = lento e fluido (respiração, câmera na mão). 3–6 = vibração mecânica. 10+ = tremor nervoso. Não precisa ser inteiro.
amp = 30
Amplitude: distância máxima do ponto original em pixels. O wiggle vai de
-amp a +amp em torno do valor atual. Aplicado em Rotation, a unidade vira graus.wiggle(freq, amp)
Função nativa do AE. Retorna um array
[x, y] quando aplicado em Position, ou um número em Rotation/Opacity. Internamente usa ruído de Perlin — infinitamente suave, nunca cria um loop perfeito sem ajuda extra.Dica pro: Para parar o wiggle em um momento exato sem keyframe, use
seedRandom(index, true) antes para fixar o seed, ou combine com posterizeTime() para dar um look stop-motion.freq = 2; // wiggles por segundo
amp = 30; // amplitude em pixels
wiggle(freq, amp);
Preview — arraste os sliders acima
Motion
Wiggle em Um Eixo
Restringe o wiggle a apenas um eixo (X ou Y), ignorando o outro. Essencial para movimentos horizontais ou verticais puros.
Entendendo a expressão
4 conceitos
w = wiggle(freq, amp)
Calcula o wiggle normalmente em 2D, retornando um array
[x, y]. Armazenamos em w para poder separar as componentes.[w[0], value[1]]
Constrói manualmente o array de posição: usa o X do wiggle (
w[0]) mas mantém o Y original (value[1]). value = posição atual do layer no AE.value[1]
value é a propriedade sendo expressa (Position). value[0] = X atual, value[1] = Y atual. Ao usar value[1], o Y fica congelado no valor do keyframe.Para eixo Y
Troque a última linha por
[value[0], w[1]] — mantém X fixo e wiggle apenas em Y.Caso de uso: texto deslizando horizontalmente, câmera em travelling lateral, HUDs que vibram só na vertical.
frequency = 2;
amplitude = 20;
w = wiggle(frequency, amplitude);
[w[0], value[1]]; // só eixo X
Preview — movimento apenas horizontal
DelayTempo
Delay por Index (Stagger)
Atrasa a animação de cada layer de acordo com sua posição na timeline. O layer 1 anima primeiro, o 2 depois, e assim por diante.
Entendendo a expressão
5 conceitos
delay = 5
Quantos frames de intervalo entre cada layer. Com 24fps,
delay=5 = ~0.2s entre cada. Aumente para um efeito mais espaçado.thisComp.frameDuration
Duração de 1 frame em segundos. Em 24fps = 0.0417s. Em 30fps = 0.0333s. Usar isso em vez de dividir por 24 torna a expressão agnóstica ao fps do projeto.
(index - 1)
O
index no AE começa em 1 (não zero). Subtrair 1 garante que o primeiro layer não tem delay (0 × d = 0). O segundo tem 1×d, o terceiro 2×d...valueAtTime(time - d)
O segredo: em vez de ler o valor no tempo atual, lemos o que o Layer 1 estava fazendo
d segundos atrás. É como "viajar no tempo" para clonar a animação com atraso.thisComp.layer(1)
Refere-se ao layer 1 da comp (o "master"). Todos os outros layers espelham ele com atraso. Você só precisa keyframer o layer 1 — os outros seguem automaticamente.
Workflow: Duplique um layer N vezes, aplique esta expressão em todos exceto no layer 1, keyframe só o layer 1. Pronto, stagger automático!
delay = 5; // frames de delay por layer
d = delay * thisComp.frameDuration * (index - 1);
thisComp.layer(1).rotation.valueAtTime(time - d);
Preview — cada dot é um layer diferente
MotionLoop
Loop a Wiggle
Wiggle que faz loop perfeito e contínuo — o AE padrão não loopa wiggle. Usa crossfade entre duas instâncias para criar uma transição invisível.
Entendendo a expressão
5 conceitos
t = time % loopSecs
O operador
% (módulo) reseta o tempo a cada loopSecs segundos. Se loopSecs=3 e estamos em t=4.2s → t volta a 1.2s. Isso faz o movimento se repetir.wiggle1 = wiggle(..., t)
O 5º argumento do wiggle é o tempo customizado. Em vez de usar
time (global), passamos t (nosso tempo ciclado). Isso força o wiggle a usar sempre o mesmo trecho de ruído.wiggle2 = wiggle(..., t - loopSecs)
A segunda instância começa com
loopSecs de atraso — ela está sempre exatamente um ciclo à frente. No ponto de loop (t=0), wiggle1 = wiggle2.linear(t, 0, loopSecs, w1, w2)
Crossfade linear entre os dois wiggles ao longo do ciclo. No início do ciclo, usa wiggle1. No final, usa wiggle2. A transição é tão suave que é invisível.
1, 0.5
3º e 4º argumentos do wiggle:
octaves=1 (menos detalhe = mais suave no loop) e amp_mult=0.5 (reduz a amplitude a 50% em oitavas extras).frequency = 2;
amplitude = 40;
loopSecs = 3;
t = time % loopSecs;
w1 = wiggle(frequency, amplitude, 1, 0.5, t);
w2 = wiggle(frequency, amplitude, 1, 0.5, t - loopSecs);
linear(t, 0, loopSecs, w1, w2);
Preview — loop perfeito e contínuo
MotionTempo
Posterize Time + Wiggle
Efeito stop-motion com wiggle. O movimento fica travado em frames discretos, dando um visual de animação quadro-a-quadro.
Entendendo a expressão
3 conceitos
posterizeTime(f)
Congela o tempo no AE para que ele só avance
f vezes por segundo, independente do fps da comp. Com f=6 em uma comp de 24fps, o AE renderiza o mesmo frame por 4 frames seguidos — o clássico "on 4s" do anime.f = 6
Frequência de frames. 12 = on 2s (12 fps), 8 = on 3s, 6 = on 4s, 4 = on 6s. Números menores = mais choppy e estilizado. Mas atenção:
posterizeTime afecta o wiggle abaixo também.wiggle(f, a)
Como o tempo já foi posterizado, o wiggle atualiza apenas
f vezes por segundo. O truque é usar o mesmo valor em freq e posterize — assim os updates do wiggle coincidem com os "travamentos" do posterize.Animação tradicional: combine com keyframes manuais e este wiggle para criar um look de cel animation moderno. Muito usado em motion design estilizado.
f = 6; // fps do stop motion
a = 15; // amplitude do wiggle
posterizeTime(f);
wiggle(f, a);
Preview — movimento travado em frames discretos
Loop
Loop In e Out
Faz loop dos keyframes para frente e para trás simultaneamente. Um clássico — precisa de pelo menos 2 keyframes na propriedade.
Entendendo a expressão
4 conceitos
loopIn()
Replica o trecho de keyframes antes do primeiro keyframe, estendendo a animação para o passado. Por padrão usa o tipo
'cycle'.loopOut()
Replica o trecho de keyframes depois do último keyframe, estendendo para o futuro. Também usa
'cycle' por padrão.loopIn() + loopOut() - value
Quando ambos estão ativos simultaneamente (no range dos keyframes), eles se somam. Subtraímos
value para compensar a dupla contagem — a matemática cancela o excesso e deixa só a soma correta.Variantes
Tente
loopOut('pingpong') para ir e voltar suavemente, loopOut('offset') para acumular valor a cada ciclo (bola quicando), ou loopOut('continue') para extrapolação linear.Atenção: Esta expressão funciona em todas as propriedades exceto Path. Para loops de path use a expressão específica de Loop Path Keyframes.
loopIn() + loopOut() - value;
Preview — vai e volta continuamente
Parent
Ignorar Rotação do Parent
O filho mantém sua rotação absoluta mesmo quando o parent gira. Aplique na propriedade Rotation do layer filho.
Entendendo a expressão
3 conceitos
value
O valor local da propriedade do filho antes da herança de parent. É o que você keyframou diretamente no layer filho.
parent.transform.rotation
A rotação do parent naquele momento. O AE somaria essa rotação ao filho automaticamente — nós subtraímos para cancelar esse comportamento.
value - parent.transform.rotation
A lógica: "pegue minha rotação, subtraia quanto o parent girou". O resultado é que o filho parece não girar nunca, independente do parent.
Quando usar: roda de bicicleta com texto na lateral, planeta com label sempre horizontal, braço de relógio com ponteiro sempre apontando para cima.
value - parent.transform.rotation;
Preview — filho (rosa) fica estático, parent gira
OpacidadeParent
Herdar Opacidade do Parent
O AE não herda opacidade via parenting nativamente. Esta expressão simula o comportamento, mantendo o controle do filho preservado.
Entendendo a expressão
4 conceitos
hasParent
Booleano nativo do AE — retorna
true se o layer tem um parent atribuído. Serve de segurança: sem parent, não há o que herdar.parent.opacity / 100
parent.opacity vai de 0 a 100. Dividimos por 100 para obter um multiplicador (0 a 1). Assim podemos multiplicar por value sem explodir o range.(parent.opacity / 100) * value
Multiplicação direta: se parent está em 50% e filho em 80%, resultado = 0.5 × 80 = 40%. O filho nunca fica mais opaco que o parent, mas pode ser mais transparente.
: value
O "else" do ternário — se não tem parent, usa o próprio
value sem alteração. A expressão é não-destrutiva.Versão simples (sem editar filho):
(hasParent) ? parent.opacity : value; — aqui o filho simplesmente copia a opacidade do parent, sem multiplicação.// versão editável — filho conserva seu valor
(hasParent) ? (parent.opacity / 100) * value : value;
Preview — filho segue a opacidade do parent
PARENT
Texto
Centralizar Anchor Point no Texto
Mantém o anchor point sempre centralizado verticalmente, mesmo quando o texto muda. Essencial para animações de scale/rotation em texto dinâmico.
Entendendo a expressão
4 conceitos
sourceRectAtTime(time)
Retorna um objeto com as dimensões reais do layer naquele frame:
{ top, left, width, height }. Para texto, reflete o bounding box atual das letras — atualiza automaticamente quando o texto muda..height / 2
Metade da altura do bounding box. É o offset necessário para mover o anchor point do topo para o centro vertical.
value[1] - ...
value[1] = Y atual do anchor point. Subtraímos porque no AE o Y cresce para baixo. Resultado: o anchor point sobe até ficar exatamente no meio.[0, y]
Retorna o novo anchor point com X=0 (esquerda) e Y centralizado. Troque
0 por sourceRectAtTime(time).width / 2 para centralizar também horizontalmente.Caso de uso: se você usar Scale ou Rotation em um texto que troca entre "Olá" e "Olá Mundo!", o pivot ficará sempre no centro — não vai pular para o lado.
// aplique no Anchor Point do layer de texto
y = value[1] - sourceRectAtTime(time).height / 2;
[0, y];
Preview — anchor sempre no centro do texto
texto
Escala
Escalar Layer para Largura Específica
Escala proporcionalmente um layer para caber exatamente em uma largura definida em pixels. Aplique na propriedade Scale.
Entendendo a expressão
4 conceitos
w = 600
A largura alvo em pixels que você quer que o layer ocupe. Pode ser fixo ou pickwhippado de um Slider Control para deixar editável sem reabrir a expressão.
thisLayer.width
A largura nativa do source do layer em pixels (sem escala aplicada). Para um PNG de 1920×1080, este valor é 1920.
s = 100 * w / thisLayer.width
Regra de três: se a largura nativa é 1920 e você quer 600px,
s = 100 * 600 / 1920 = 31.25%. A escala em percentual que faz caber exatamente.[s, s]
Retorna a escala como array
[x, y] com o mesmo valor em ambos — escala proporcional. Para esticar apenas na horizontal, use [s, 100].Versão dinâmica: substitua
600 por thisComp.width para sempre cobrir a largura inteira da comp, independente do tamanho da source.w = 600; // largura alvo em pixels
s = 100 * w / thisLayer.width;
[s, s];
Preview — barra mostra a escala proporcional
source: 1920px
31.25% → 600px
Motion
Wiggle Entre Dois Valores
Confina o wiggle entre um mínimo e máximo. Diferente do wiggle comum que oscila em torno de zero, este é centrado entre dois limites definidos.
Entendendo a expressão
4 conceitos
amp = Math.abs(max-min)/2
Amplitude calculada automaticamente. Se min=-10 e max=50, o range é 60. A amplitude é metade = 30. O wiggle oscilará ±30 em torno do centro.
offset = (max+min)/2
Centro do range. Com min=-10 e max=50, o centro é (-10+50)/2 = 20. O offset desloca o wiggle para que ele dance em torno de 20 em vez de 0.
wiggle(freq, amp) + offset
O wiggle normal vai de
-amp a +amp. Somando offset, o range final passa a ser de min a max. Matemática simples, resultado preciso.Atenção: freq vs f
A linha final usa
wiggle(f, a) — mas f e a não foram declarados! Troque por wiggle(freq, amp) usando as variáveis corretas.min = -10; // valor mínimo
max = 50; // valor máximo
freq = 3;
amp = Math.abs(max-min)/2;
offset = (max+min)/2;
wiggle(freq, amp) + offset;
Preview
Loop
Loop de Path Keyframes
Faz loop contínuo de keyframes em propriedades de Path (shape layers e máscaras). O
loopOut() não funciona em path — esta é a solução.
Entendendo a expressão
4 conceitos
numKeys
Número de keyframes na propriedade atual. A checagem
numKeys > 1 garante que há pelo menos 2 keyframes para fazer um loop — com 1 ou 0, retorna value sem fazer nada.t1 / t2 / span
t1 = tempo do primeiro keyframe. t2 = tempo do último. span = duração total do ciclo em segundos. O loop se repete a cada span segundos.delta = time - t2
Quanto tempo passou desde o último keyframe. Este é o "tempo excedente" que precisamos mapear de volta para dentro do ciclo.
valueAtTime(t1 + t)
Em vez de
loopOut(), lemos o valor em t1 + (delta % span) — que é um ponto dentro do range de keyframes. Comportamento idêntico ao loopOut('cycle').// aplique na propriedade Path de uma shape ou máscara
if (numKeys > 1 && time > key(numKeys).time) {
t1 = key(1).time;
t2 = key(numKeys).time;
span = t2 - t1;
delta = time - t2;
t = delta % span;
valueAtTime(t1 + t);
} else { value; }
Preview — loop contínuo
TempoControle
Delay com Slider Control
Usa um Slider Control para atrasar a animação em segundos, pickwhippado diretamente. Ideal para MOGRTs onde o editor precisa ajustar o timing.
Entendendo a expressão
3 conceitos
effect("Delay")("Slider")
Acessa o valor de um Slider Control aplicado no layer "Controls". Diferente do delay por index, aqui o editor pode mudar o delay no Premiere Pro sem precisar entrar na expressão.
valueAtTime(time - delay)
Lê o valor da propriedade
delay segundos no passado. Se delay=1.5, mostra o que a propriedade estava fazendo 1.5s atrás — criando um delay visual perfeito.Unidade: segundos
O Slider é em segundos (não frames). Para delay = 0.5s, coloque 0.5 no slider. Isso é mais intuitivo para editores que trabalham por tempo, não por frames.
MOGRT workflow: exponha o "Delay" como Essential Graphic e o editor de vídeo pode ajustar o timing direto no Premiere, sem abrir o AE.
// pickwhip para o seu Slider Control (em segundos)
delay = thisComp.layer("Controls")
.effect("Delay")("Slider");
valueAtTime(time - delay);
Preview
Opacidade
Auto Fade In & Out por Marker
Fade automático usando marcadores com comment "Highlight". O marcador define onde começa e sua duração define onde termina.
Entendendo a expressão
4 conceitos
marker.nearestKey(time)
Encontra o marcador mais próximo do tempo atual. Isso permite ter múltiplos marcadores e a expressão reage a cada um independentemente.
tag == 'Highlight'
Só ativa o fade se o comment do marcador for exatamente
'Highlight'. Isso permite ter outros marcadores no layer sem acionar o efeito.tMax = tMin + marker.key(m).duration
A duração do marcador (campo "Duration" nas propriedades) define quando o fade-out começa. Arraste a borda do marcador no AE para controlar o tempo de exibição.
linear(time, tMin - framesToTime(fadeFrames), tMin, 0, value)
linear() interpola linearmente. Fade-in: vai de 0% para 100% nos fadeFrames frames antes do marcador. Fade-out: vai de 100% para 0% nos frames finais.// aplique na Opacity — crie marcador com comment "Highlight"
fadeFrames = 6; m = 0; t = time;
if (marker.numKeys > 0) {
m = marker.nearestKey(time).index;
if (marker.key(m).comment == 'Highlight') {
tMin = marker.key(m).time;
tMax = tMin + marker.key(m).duration;
if (t < tMin)
linear(time, tMin-framesToTime(fadeFrames), tMin, 0, value);
else
linear(time, tMax-framesToTime(fadeFrames), tMax, value, 0);
} else { value; }
} else { value; }
Preview — fade automático
opacity
Opacidade
Inverter Opacidade
Alterna a opacidade inversamente com outro layer — quando um aparece, o outro desaparece. Perfeito para troca de layers sem keyframe.
Entendendo a expressão
3 conceitos
t = thisComp.layer("Back").transform.opacity
Lê a opacidade do layer "Back" (o layer que queremos inverter). Use pickwhip em vez de digitar o nome para evitar erros de digitação.
linear(t, 0, value, 100, 0)
linear(entrada, inMin, inMax, outMin, outMax). Quando t=0 (Back invisível), retorna value (este layer visível). Quando t=100 (Back visível), retorna 0.value
O
value aqui é a opacidade deste layer. Usar value em vez de hardcodar 100 garante que o layer respeita seus próprios keyframes de opacidade.// pickwhip para o layer que quer inverter
t = thisComp.layer("Back").transform.opacity;
linear(t, 0, value, 100, 0);
Preview — um sobe, o outro desce
⇄
ParentEscala
Ignorar Escala do Parent
Mantém a escala visual do filho constante, mesmo com o parent escalando. Aplique na escala do layer filho.
Entendendo a expressão
4 conceitos
ps = parent.transform.scale.value
Lê a escala atual do parent como array
[x, y]. Precisamos do .value explícito porque estamos lendo de outra propriedade.for (i = 0; i < ps.length; i++)
Loop pelos eixos (X e Y). Fazer por loop em vez de hardcodar os índices torna a expressão compatível com layers 3D que teriam
[x, y, z].value[i] * 100 / ps[i]
Regra de três: se o filho está em 100% e o parent em 200%, a escala corrigida é
100 * 100 / 200 = 50%. O filho aparece em 100% visualmente.ps[i] == 0 ? 0 : ...
Proteção contra divisão por zero — se a escala do parent for 0, retorna 0 em vez de
Infinity.// aplique na Scale do layer filho
s = [];
ps = parent.transform.scale.value;
for (i = 0; i < ps.length; i++)
s[i] = (ps[i]==0) ? 0 : value[i] * 100 / ps[i];
s;
Preview — filho mantém tamanho enquanto parent cresce
ControleOpacidade
Controlar com Checkbox
Liga/desliga qualquer propriedade (ex: opacidade) usando um Checkbox Control. Clique no quadrado abaixo para ver ao vivo.
Entendendo a expressão
3 conceitos
effect("Nome")("Checkbox")
O Checkbox retorna 1 (ligado) ou 0 (desligado). Ao multiplicar por
value, preserva ou zera a propriedade.value * checkbox
Se checkbox=1:
value * 1 = value (nada muda). Se checkbox=0: value * 0 = 0 (zera a opacidade). É uma porta lógica AND simples.Aplicação
Funciona em qualquer propriedade numérica: opacidade, escala, rotação. Coloque todos os checkboxes num único layer "Controls" para manter a comp organizada.
value * effect("Meu Controle")("Checkbox");
Preview — clique no checkbox
✓
checkbox
LAYER
ControleOpacidade
Show/Hide com Dropdown
Mostra apenas o layer cujo nome começa com o número selecionado no Dropdown Control. Clique nas opções para ver ao vivo.
Entendendo a expressão
3 conceitos
effect("Dropdown Control")("Menu").value
O Dropdown retorna um número inteiro (1, 2, 3…) correspondente à opção selecionada. O
.value no final garante que pegamos o número, não o objeto.parseInt(thisLayer.name.charAt(0))
Pega o primeiro caractere do nome do layer e converte para inteiro. Layer "1 - Logo" retorna 1. Layer "3 - Fundo" retorna 3. Simples e eficiente.
sel === parseInt(...) ? 100 : 0
Ternário: se o número do dropdown bate com o do layer, opacidade = 100. Se não bate, opacidade = 0. Um layer de cada vez.
// nomeie layers "1 - Nome", "2 - Nome", etc.
sel = effect("Dropdown Control")("Menu").value;
(sel === parseInt(thisLayer.name.charAt(0))) ? 100 : 0;
Preview — clique para alternar
1 — Opção A
2 — Opção B
3 — Opção C
Motion
Número Aleatório Fixo
Gera um valor aleatório único para cada layer (baseado no index) que nunca muda ao longo do tempo. Ideal para offsets aleatórios porém consistentes.
Entendendo a expressão
3 conceitos
seedRandom(index, true)
index = número do layer na comp. Usar isso como seed garante que cada layer tem um número diferente. O segundo argumento true = "frozen" — congela o seed no tempo.true (frozen)
Com
true, o random() retorna sempre o mesmo valor independente do tempo atual. Com false, o valor mudaria a cada frame — voltando a ser um wiggle.random(0, 100)
Retorna um número entre 0 e 100 fixo para este layer. Use para: alturas aleatórias de barras, posições iniciais variadas, rotações únicas, delays personalizados.
Dica: combine com
delay = seedRandom(index, true); random(0.5, 2) para dar delays aleatórios e únicos para cada layer de uma animação stagger.seedRandom(index, true); // true = congelado no tempo
myValue = random(0, 100);
Preview — alturas únicas e fixas por layer
Posição
Centro e Escala da Comp
Centraliza automaticamente um layer na composição. Funciona em qualquer tamanho de comp — 1080p, 4K, vertical, quadrado.
Entendendo a expressão
3 conceitos
[thisComp.width, thisComp.height]
Cria um array com as dimensões da composição.
thisComp.width e thisComp.height são propriedades de leitura nativas do AE — se a comp mudar de tamanho, a expressão se adapta automaticamente.* 0.5
Multiplicar um array por um escalar no AE multiplica cada elemento:
[1920, 1080] * 0.5 = [960, 540]. Resultado: o centro exato da composição.Aplicação
Aplique na Position do layer (com anchor point em [0,0] ou centro). Essencial para templates que serão usados em múltiplos tamanhos de saída.
Para cobrir a comp: combine com escala
s = 100 * thisComp.width / thisLayer.width; [s,s] — centralizado E cobrindo 100% da largura.// aplique na Position do layer
[thisComp.width, thisComp.height] * 0.5;
Preview
Tempo
Data Atual Formatada
Exibe a data atual do sistema no formato configurável. Aplique na fonte Text Source de um layer de texto.
Entendendo a expressão
4 conceitos
new Date(Date(0))
O argumento
Date(0) (string) faz o JavaScript retornar a data atual do sistema no momento do render. Cada vez que você renderiza, pega a data do dia.d.getMonth()+1
getMonth() retorna 0-11 (zero-indexed). Por isso somamos +1 para ter Janeiro=1, Dezembro=12. Este é um erro clássico para quem vem do AE sem conhecer JS.pad(n)
Adiciona zero à esquerda em números <10.
pad(4) → "04". Garante que o formato DD/MM/AA seja sempre consistente, mesmo em dias/meses de um dígito.yearLength = 2
Com 2: mostra os últimos 2 dígitos do ano (26 para 2026). Com 4: mostra o ano completo (2026). Troque o
slice(2) para slice(0) para ano completo.d = new Date(Date(0)); // data do sistema no render
sep = "/";
function pad(n){ return n<=9 ? "0"+n : n }
yr = d.getFullYear().toString().slice(2); // 26
pad(d.getDate()) + sep + pad(d.getMonth()+1) + sep + yr;
Preview — data atual do sistema
Escala
Manter Espessura do Stroke
Mantém o traço sempre com a mesma espessura visual, mesmo quando o layer é escalado. Aplique na propriedade Stroke Width da shape layer.
Entendendo a expressão
3 conceitos
toComp([0,0]) e toComp([0.7071, 0.7071])
Converte pontos do espaço local para o espaço da composição. A distância entre esses pontos muda conforme a escala do layer — usamos isso para medir quanto o layer foi escalado.
length(p1, p2)
Calcula a distância euclidiana entre dois pontos:
√((x2-x1)² + (y2-y1)²). O valor 0.7071 = 1/√2 é escolhido para que a distância em escala 100% = 1. Assim a divisão compensa exatamente.value / length(...) || 0.001
Divide o stroke pelo fator de escala atual. Se escala=200%, divide por 2 — o stroke fica metade do tamanho em pixels locais, mas visualmente continua igual. O
|| 0.001 evita divisão por zero.// aplique no Stroke Width da shape
value / length(toComp([0,0]), toComp([0.7071,0.7071])) || 0.001;
Preview — stroke sempre igual enquanto shape cresce
stroke
Tempo
Disparar Expressão em Marker
Template boilerplate para acionar lógica a partir de marcadores. Substitua
// Do Stuff pela animação desejada usando t como tempo desde o marker.
Entendendo a expressão
4 conceitos
marker.nearestKey(time).index
Encontra o index do marcador mais próximo do tempo atual. Usado como ponto de partida — depois verificamos se estamos depois dele com a linha seguinte.
if (marker.key(n).time > time) n--
Se o marcador mais próximo ainda está no futuro, voltamos um. Isso garante que
n é sempre o último marcador passado, não o próximo.t = time - marker.key(n).time
Cria um "relógio local" que começa em 0 no momento do marker e cresce com o tempo. Use
t para animar: linear(t, 0, 0.5, 0, 100) = fade-in de meio segundo.n == 0
Antes do primeiro marker,
n é 0 (nenhum marker passado). A checagem retorna value sem fazer nada — a propriedade se comporta normalmente antes do trigger.n = 0;
if (marker.numKeys > 0) {
n = marker.nearestKey(time).index;
if (marker.key(n).time > time) n--;
if (n == 0) { value; }
else {
t = time - marker.key(n).time; // tempo desde o marker
// Do Stuff com t
}
} else { value; }
Preview — playhead passando por markers
Posição
2D para 3D Null
Conecta a posição 2D de um layer ao ponto de origem de um Null 3D, projetando as coordenadas 3D no plano da câmera.
Entendendo a expressão
3 conceitos
thisComp.layer("Null 3D")
Referencia o layer pelo nome. Sempre use pickwhip para evitar erros de digitação. Se o layer mudar de nome, a expressão quebrará.
.toComp([0,0,0])
Converte o ponto de origem local do Null 3D (0,0,0 no espaço do layer) para coordenadas 2D da composição, levando em conta posição 3D, rotação e câmera.
Resultado [x, y]
toComp() retorna sempre um array 2D [x, y] — as coordenadas 2D correspondentes ao ponto 3D na câmera atual. Aplique na posição do layer 2D.Caso de uso: label 2D (HUD, nome de personagem) que segue um objeto 3D em cena. O Null fica parentado ao objeto 3D, e o label 2D segue o Null via esta expressão.
// aplique na Position do layer 2D
thisComp.layer("Null 3D").toComp([0,0,0]);
Preview — ponto 2D seguindo um 3D null
Motion
Overshoot / Bounce
Adiciona um bounce elástico amortecido após o segundo keyframe, usando a velocidade real do layer no momento do impacto — sem keyframes extras.
Entendendo a expressão
3 conceitos
freq, amp, decay
Frequência controla o número de oscilações por segundo. Amplitude escala o tamanho do bounce em relação à velocidade de entrada. Decay determina quão rápido o bounce se apaga — valores maiores amortecem mais rápido; diminua para uma mola mais "molinha".
velocityAtTime(key(2).time-0.01)
Captura a velocidade exata do layer um instante antes do segundo keyframe. O bounce respeita a "força" da chegada: uma animação rápida gera um bounce maior; uma animação lenta gera um bounce menor, automaticamente.
Math.sin(x·freq) / Math.exp(x·decay)
A fórmula de uma onda sinusoidal amortecida:
sin gera a oscilação e exp reduz progressivamente a amplitude ao longo do tempo. O resultado é um bounce que se apaga naturalmente, como uma mola real.Dica pro: Aplique só na propriedade em movimento (posição X, Y ou rotação). Se o valor do bounce ficar muito intenso, diminua
amp (ex: 0.1). Para parar o efeito antes do fim da comp, adicione um terceiro keyframe idêntico ao segundo.freq=6;
amp=0.2;
decay=0.5;
if (numKeys>1 && time>key(2).time) {
v=velocityAtTime(key(2).time-0.01);
x=time-key(2).time;
s=amp*v*Math.sin(x*freq)/Math.exp(x*decay);
value+s;
}
else {
value;
}
Preview — bounce amortecido após keyframe
Nenhuma expressão encontrada
Tente outro termo ou selecione "Todas" nas categorias.