Skip to main content

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ável
wiggle(3, 15)
// com seed — reproduzível, ajustável
wiggle(3, 15, 1, 0.5, 42)
// freq, amplitude, octaves, multiplier, seed

Seeds 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 leve
w = wiggle(2, 8, 1, 0.5, 3);
[w[0], value[1]]
// wiggle só em rotação — texto que treme
wiggle(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 impacto
impactTime = 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.

  1. Cria um adjustment layer acima de tudo
  2. Aplica Effect > Noise & Grain > Add Grain
  3. No campo Noise Phase, coloca a expressão:
// seed que muda a cada frame
time * 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ível

Referência por tipo de película

PelículaIntensitySizeSoftness
35mm drama0.351.80.3
16mm doc0.652.20.15
Super 80.903.00.1
Kodak 4000.451.50.4
Digital ISO alto0.300.80.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 centro
cx = 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.

  1. Cria um shape layer preto do tamanho da comp
  2. Adiciona um Repeater com altura de 4px (2px preenchido, 2px vazio)
  3. Opacidade: 25-40%, modo Normal (não Screen)
  4. Na opacidade, adiciona um wiggle leve:
// scanlines que flutuam levemente
25 + 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

ModoQuando usar
OverlayUso geral, integração natural
Soft LightQuando Overlay é forte demais
MultiplyPapel, pergaminho, textura escura
ScreenLuz vazada, grão claro
LuminositySó textura de luminância, sem alterar cor
// opacidade da textura que pulsa levemente
baseOp = 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).

  1. Seleciona o text layer
  2. Animate > Position (e/ou Rotation, Scale)
  3. Adiciona Selector > Wiggly
  4. 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 datilografado
seed = 42;
charIndex = textIndex;
variation = (noise([seed, charIndex]) - 0.5) * 12;
[0, variation]
// opacidade por caractere — tinta irregular de letterpress
seed = 77;
variation = noise([textIndex * 0.3, seed]) * 15;
100 - variation

Color 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)

  1. Duplica o layer principal
  2. Aplica Gaussian Blur agressivo (30-60px)
  3. Levels: booste os altos (Input White: 180-200)
  4. Blending Mode: Screen
  5. Hue/Saturation empurrado pra vermelho/laranja
  6. 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. Scanlines
4. Chromatic Aberration
5. Vignette
6. 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