Estética Analógica e Imperfeição Intencional
A diferença entre grain bem feito e filtro preguiçoso é que no grain bem feito você não percebe. Você sente que a imagem tem profundidade sem saber por quê.
O mercado saturou o visual hiper-polido. Agora paga caro por coisas que parecem imperfeitas. Mas imperfeição de verdade é controlada: você decide onde, quanto e quando ela aparece. É design, não descuido.
A pergunta antes de qualquer efeito analógico: o que esse defeito está comunicando, e pra quem?
Quando não usar
Grain e VHS não fazem sentido em financeiro, jurídico, farmacêutico, data viz, ou qualquer peça onde textura compete com informação. E “tá na moda” não é razão de design.
Wiggle com seed: aleatoriedade controlada
O wiggle() sem seed é o primeiro erro de todo mundo. Você não consegue reproduzir, não consegue relacionar elementos diferentes, e fica parecendo acidente.
// sem seed — aleatório demais, incontrolávelwiggle(3, 15)
// com seed — reproduzível, ajustávelwiggle(3, 15, 1, 0.5, 42)// freq, amplitude, octaves, multiplier, seedSeeds iguais = movimento idêntico entre elementos. Dê seeds diferentes pra cada layer (7, 14, 21…) e elas se movem diferente mas dentro da mesma lógica.
// wiggle só horizontal — câmera handheld levew = wiggle(2, 8, 1, 0.5, 3);[w[0], value[1]]
// wiggle só em rotação — texto que tremewiggle(3, 2, 1, 0.5, 12)Wiggle com envelope temporal
// cresce no início, some no fim — o objeto "respira"freq = 4;amp = 20;seed = 7;
t = time - inPoint;totalDur = outPoint - inPoint;envelope = Math.sin(Math.PI * t / totalDur);
wiggle(freq, amp * envelope, 1, 0.5, seed)Camera shake sem plugin
Cria um nulo, parenteia a câmera nele. Expressão na posição do nulo:
freq = 12;ampX = 15;ampY = 10;
shakeX = wiggle(freq, ampX, 2, 0.75, 101)[0];shakeY = wiggle(freq, ampY, 2, 0.75, 202)[1];
[value[0] + shakeX, value[1] + shakeY]Com slider de controle fica muito melhor — keyframe o slider em vez de mexer na expressão:
intensity = thisLayer.effect("Shake Intensity")("Slider");
shakeX = wiggle(12, 20 * intensity, 2, 0.75, 101)[0];shakeY = wiggle(12, 14 * intensity, 2, 0.75, 202)[1];
[value[0] + shakeX, value[1] + shakeY]Zero no slider: sem shake. Em 1: shake padrão. Em 2: caos.
// shake que decai após impactoimpactTime = 2.5;decayDur = 0.8;
t = time - impactTime;envelope = (t > 0 && t < decayDur) ? Math.exp(-t * 5) : 0;
shakeX = wiggle(18, 25 * envelope, 2, 0.5, 55)[0];shakeY = wiggle(18, 18 * envelope, 2, 0.5, 66)[1];
[value[0] + shakeX, value[1] + shakeY]Grain
Grain estático não parece analógico, parece sujeira. No filme, cada frame tem uma distribuição diferente de grãos de prata. Tem que mudar a cada frame.
- Cria um adjustment layer acima de tudo
- Aplica Effect > Noise & Grain > Add Grain
- No campo Noise Phase, coloca a expressão:
// seed que muda a cada frametime * thisComp.frameRate * 13.7// 13.7 é arbitrário — qualquer número não-inteiro funciona// número inteiro pode criar padrão periódico visívelReferência por tipo de película
| Película | Intensity | Size | Softness |
|---|---|---|---|
| 35mm drama | 0.35 | 1.8 | 0.3 |
| 16mm doc | 0.65 | 2.2 | 0.15 |
| Super 8 | 0.90 | 3.0 | 0.1 |
| Kodak 400 | 0.45 | 1.5 | 0.4 |
| Digital ISO alto | 0.30 | 0.8 | 0.6 |
Grain nas sombras
Película real tem mais grain em sombras que em altas luzes. Ativa Monochromatic e muda o modo de blending pra Luminance. Adiciona um Levels com mid-tones levemente abaixados pra reforçar o grain nas sombras.
Chromatic Aberration
Aberração cromática real aparece nas bordas do frame, não no centro. A versão clichê aplica separação uniforme por toda a imagem e parece errada porque não é assim que a física funciona.
// deslocamento do canal baseado na distância do centrocx = thisComp.width / 2;cy = thisComp.height / 2;
px = value[0];py = value[1];
dx = px - cx;dy = py - cy;
dist = Math.sqrt(dx * dx + dy * dy);maxDist = Math.sqrt(cx * cx + cy * cy);normalized = dist / maxDist;
ctrl = thisComp.layer("[CONTROLS]");intensity = ctrl.effect("CA Intensity")("Slider");
offset = intensity * normalized * normalized; // quadrático — bordas mais fortes
[cx + dx / dist * (dist + offset), cy + dy / dist * (dist + offset)]VHS vs. lente
VHS não tem aberração de lente. Tem instabilidade de cor por crosstalk entre linhas. Para simular:
freq = 8;amp = 3;w = wiggle(freq, amp, 2, 0.5, 42);[value[0] + w[0], value[1]]Resultado diferente, uso diferente.
Scanlines e VHS
Scanlines sólidas em Screen ou Multiply parecem erradas porque linhas de CRT real têm gradiente, não são sólidas.
- Cria um shape layer preto do tamanho da comp
- Adiciona um Repeater com altura de 4px (2px preenchido, 2px vazio)
- Opacidade: 25-40%, modo Normal (não Screen)
- Na opacidade, adiciona um wiggle leve:
// scanlines que flutuam levemente25 + wiggle(0.5, 3, 1, 0.5, 99)Para o jitter de tracking de VHS (a instabilidade que aparece no topo do frame):
yPos = value[1];frameH = thisComp.height;relativeY = yPos / frameH;
edgeFactor = Math.max(0, 1 - relativeY * 10);jitter = wiggle(15, 8 * edgeFactor, 1, 0.5, 77)[1];
[value[0], value[1] + jitter]Textura com blending mode certo
| Modo | Quando usar |
|---|---|
| Overlay | Uso geral, integração natural |
| Soft Light | Quando Overlay é forte demais |
| Multiply | Papel, pergaminho, textura escura |
| Screen | Luz vazada, grão claro |
| Luminosity | Só textura de luminância, sem alterar cor |
// opacidade da textura que pulsa levementebaseOp = 65;breath = wiggle(0.3, 5, 1, 0.5, 22);Math.max(0, Math.min(100, baseOp + breath))Tipografia analógica
Texto perfeitamente alinhado em grid grita “produção digital”. Para variação por caractere, o caminho é o Text Animator, não wiggle direto no layer (que move tudo junto).
- Seleciona o text layer
- Animate > Position (e/ou Rotation, Scale)
- Adiciona Selector > Wiggly
- No Wiggly Selector: Wiggles/Second = 0, Correlation = 50%
Com Wiggles/Second em zero, cada caractere fica numa posição levemente diferente mas nenhum muda ao longo do tempo. Comportamento de texto impresso irregularmente.
// baseline shift aleatório por caractere — texto datilografadoseed = 42;charIndex = textIndex;variation = (noise([seed, charIndex]) - 0.5) * 12;[0, variation]// opacidade por caractere — tinta irregular de letterpressseed = 77;variation = noise([textIndex * 0.3, seed]) * 15;100 - variationColor grade analógico
Película real tem latitude limitada, sombras com lift (preto de película não é 0,0,0), e primárias desbalanceadas dependendo da emulsão.
Parâmetros base no Lumetri Color:
Lift (RGB): 15-25 (sombras não chegam ao preto puro)Gamma: levemente quente (+5 a +10 no vectorscope)Highlights: -15 a -25 (comprimidos)Saturation: 85-95 (película é menos saturada que digital)Halation (halo de altas luzes de 16mm)
- Duplica o layer principal
- Aplica Gaussian Blur agressivo (30-60px)
- Levels: booste os altos (Input White: 180-200)
- Blending Mode: Screen
- Hue/Saturation empurrado pra vermelho/laranja
- Opacidade: 20-40%
Stack correto — ordem importa
Grain antes do grade é errado porque ao gradar você altera o próprio grain, o que não corresponde ao processo físico.
de baixo pra cima:1. Color Grade (Lumetri)2. Grain (Add Grain)3. Scanlines4. Chromatic Aberration5. Vignette6. Light Leak (acima da vignette se quiser que "passe por ela")Nulo CONTROLS: painel de ajuste centralizado
Para projetos com vários efeitos analógicos, centraliza tudo num nulo chamado [CONTROLS]:
// qualquer expressão referencia assim:controls = thisComp.layer("[CONTROLS]");shakeInt = controls.effect("Shake Intensity")("Slider");wobble = controls.effect("Wobble Amount")("Slider");Sliders recomendados: Shake Intensity, Wobble Amount, CA Intensity, Grain Opacity. Entrega pro cliente com um “painel de imperfeição” sem abrir nenhuma expressão.
Checklist antes de exportar
- Grain muda a cada frame (Noise Phase com expressão de tempo)
- Grain mais visível nas sombras que nas altas luzes
- Chromatic aberration maior nas bordas, menor no centro
- Sombras têm lift (não chegam ao preto puro)
- Saturação levemente reduzida (85-95% do original)
- Vignette não é perfeitamente circular
- Nenhum efeito a 100% de opacidade
- O look faz sentido pro contexto, não é só “ficou bonito”
Recursos
- Gorilla Grain — grain real escaneado de película
- LUT Robot — LUTs de emulação de película
- Koji — emulação de película com LUTs exportáveis
- MotionVFX — texturas e overlays profissionais
- AEJuice Free Pack — shakes e grain pra referência