🎬 Visão geral — imitar o cinema com matemática
Os templates cinemáticos compartilham uma filosofia: cada efeito físico de câmera ou pós-produção pode ser descrito como uma função matemática do frame. Tremor de câmera é sin(frame) com decaimento. Film burn é um gradiente radial com intensidade que varia. Ken Burns é escala + translação linear.
🎯 Três categorias internas
- •Movimento de câmera:
camera-shake,whip-pan,ken-burns,zoom-pulse— movem a imagem ou criam a ilusão de movimento de lente. - •Composição de tela:
letterbox-reveal,parallax-pan,spotlight-reveal— controlam o que é visível e como as camadas se relacionam. - •Efeitos de pós-produção:
film-burn,vignette-pulse— sobrepõem camadas de textura ou sombra ao conteúdo.
💡 Combinar com moderação
Efeitos cinemáticos são tempero — use um ou dois por cena, não todos ao mesmo tempo. camera-shake + film-burn no mesmo momento cria um clímax impactante. Os mesmos dois efeitos durante todo o vídeo causam fadiga visual.
📳 camera-shake — tremor que decai
O camera-shake simula o tremor de câmera de mão: começa intenso e decai exponencialmente até o movimento parar. A técnica central é sin(frame) multiplicado por uma amplitude que diminui com o frame.
const { fps } = useVideoConfig(); // amplitude decai de maxAmp até 0 ao longo do impacto const maxAmp = 18; const decayFrames = fps * 1.5; // 1.5s de tremor const amplitude = interpolate( frame, [0, decayFrames], [maxAmp, 0], { extrapolateRight: "clamp" } ); const shakeX = Math.sin(frame * 1.7) * amplitude; const shakeY = Math.cos(frame * 2.3) * amplitude * 0.6; // aplicar: transform: `translate(${shakeX}px, ${shakeY}px)`
💡 Por que multiplicadores diferentes em X e Y
Os valores 1.7 e 2.3 são intencionalmente não-múltiplos entre si. Se fossem iguais (ou um múltiplo do outro), os ciclos de X e Y se sincronizariam criando um padrão repetitivo visível. Valores primos ou irracionais geram trajetória mais orgânica e caótica — parecida com tremor real.
Frame 0 — impacto máximo
A amplitude está no pico. O deslocamento pode ser de ±18px. Use para simular explosão, batida ou corte abrupto.
Frames intermediários — decaimento
A amplitude cai linearmente via interpolate. O tremor persiste mas enfraquece, como a vibração após um impacto físico se dissipando.
Após decayFrames — estabilidade
extrapolateRight: "clamp" garante que a amplitude não vire negativa. A câmera para completamente e o cena segue estável.
🔥 film-burn — light leak quente
O film-burn sobrepõe manchas de luz alaranjada e amarela que crescem e somem em loop, imitando o efeito de exposição de luz em filme físico. A intensidade das manchas segue uma curva em sino — aparece do nada, atinge o pico no meio e desaparece.
🌡️ A curva em sino da intensidade
O pico no meio cria a sensação de que a luz "vaza" e depois "fecha". Três gradientes radiais com posições oscilantes dão a aparência orgânica e imprevisível do film burn real.
const totalFrames = fps * 3; // intensidade em sino: 0 → 0.85 → 0 const intensity = interpolate( frame, [0, totalFrames * 0.5, totalFrames], [0, 0.85, 0], { extrapolateRight: "clamp" } ); // posição oscilante para parecer "vazamento" orgânico const xShift1 = 50 + Math.sin(frame * 0.05) * 30;
✓ O que FAZER
- ✓Usar em transições entre cenas para esconder o corte.
- ✓Combinar com noise-grain para o look completo de filme antigo.
- ✓Ajustar intensidade máxima (0.85) para uso mais ou menos sutil.
✗ O que NÃO fazer
- ✗Usar em vídeos com paleta de cores fria — o laranja quente contrasta demais.
- ✗Deixar em loop contínuo — perde o impacto após a segunda ocorrência.
- ✗Intensidade muito alta (>0.9) sobre texto — ilegível.
🎞️ letterbox-reveal — barras pretas que se retraem
O letterbox-reveal começa com barras pretas cobrindo o topo e o fundo da tela — o formato letterbox cinematográfico 2.35:1 — e as retrai ao longo do tempo para revelar a imagem completa. O efeito comunica instantaneamente "este é um momento cinematográfico".
💡 A matemática das barras
Cada barra tem altura inicial que cobre ~12% da tela (o padrão do letterbox 2.35:1 em 16:9). O spring anima essa altura até zero. Como o spring usa clamp, as barras nunca vão para negativo — desaparecem limpos.
const { height, fps } = useVideoConfig(); const barH = height * 0.12; // 12% = letterbox 2.35:1 const s = spring({ frame, fps, config: { damping: 18, stiffness: 60 } }); // barra superior: começa em barH e vai para 0 const topBarH = interpolate(s, [0, 1], [barH, 0]); // div: position absolute, top: 0, height: topBarH, bg: black
🔦 spotlight-reveal — clip-path círculo que expande
O spotlight-reveal usa clip-path: circle() para revelar o conteúdo a partir de um ponto central — como um holofote que se abre. O raio do círculo aumenta de zero até cobrir a tela inteira ao longo do tempo.
🔵 Clip-path circle no CSS
A propriedade clip-path: circle(rPx at xPx yPx) é suportada nativamente e performática no browser. No render do Remotion ela é renderizada via Puppeteer com suporte total. O raio pode ser calculado como percentagem da diagonal da tela para garantir cobertura total.
const { width, height, fps } = useVideoConfig(); const maxRadius = Math.sqrt(width ** 2 + height ** 2) / 2; const s = spring({ frame, fps, config: { damping: 20, stiffness: 50 } }); const radius = s * maxRadius; // style: clipPath: `circle(${radius}px at 50% 50%)`
✓ O que FAZER
- ✓Mudar o centro (
at X% Y%) para revelar de um canto ou de onde o olho deve ir primeiro. - ✓Usar damping alto (>18) para um reveal suave sem bounce.
- ✓Combinar com vignette-pulse para manter o foco mesmo após o reveal.
✗ O que NÃO fazer
- ✗Usar raio menor que a diagonal — deixa cantos escuros visíveis.
- ✗Stiffness muito alto — spring com bounce no reveal de imagem parece glitch.
- ✗Aplicar em transições muito curtas (<15 frames) — o efeito não aparece.
🌑 vignette-pulse vs. whip-pan — dois estilos opostos
O vignette-pulse é sutil e emocional: escurece as bordas da tela em pulso, focando o olhar no centro. O whip-pan é agressivo e dinâmico: um deslocamento horizontal rápido com blur simulando o pan de câmera em velocidade máxima.
vignette-pulse — sutil, foco
- •Radial gradient preto nas bordas com opacidade pulsante via sin wave.
- •Opacidade:
0.3 + sin(frame * 0.1) * 0.15— pulso suave e lento. - •Ideal para documentários, entrevistas, foco narrativo.
whip-pan — energético, corte
- •TranslateX rápido com motion blur via
filter: blur()proporcional à velocidade. - •Velocidade:
interpolate(frame, [0, dur/2, dur], [0, maxVel, 0]). - •Ideal para transições entre cenas, vídeos de ação, montagens rápidas.
const velocity = interpolate( frame, [0, durationInFrames / 2, durationInFrames], [0, 400, 0], { extrapolateRight: "clamp" } ); const blurAmount = Math.abs(velocity) / 80; // style: { transform: `translateX(${velocity}px)`, filter: `blur(${blurAmount}px)` }
📚 Biblioteca completa — todos os 9 templates
Referência rápida para todos os templates cinemáticos com arquivo, técnica central e contexto de uso.
📌 Resumo do módulo
sin(frame) × amplitude com decaimento via interpolate. Multiplicadores não-múltiplos criam trajetória orgânica.clip-path: circle() com raio crescendo de zero até a diagonal completa.Conclusão da Trilha 2:
Você dominou as três categorias de recursos visuais do Remotion: imagem & mídia, backgrounds e efeitos cinemáticos. A Trilha 3 — Combinação — mostra como encadear esses templates em sequências narrativas completas.