Curta de história em desenho animado 3D (three.js + Remotion)
Exemplo comprovado: The Bridge That Fell for a Song. É um curta original de 67 segundos sobre a ponte de Broughton de 1831 e 74 soldados marchando em passo.
- Código:
src/videos/bridge/do seu projeto Remotion (composiçãoBridgeShort, 1080x1920, 30 fps). - Roteiro, narração e som:
~/bridge-short/. - Pesquisa de estilo:
references/.
A referência de estilo é um canal estudado em particular (references/: STYLE_BIBLE.md, relatórios/*.md, frames/).
- Esses vídeos são material de estudo particular. Nunca faça upload, publique ou os compartilhe.
- Nunca copie seus roteiros, personagens ou cenas. História, personagens e narração são SEMPRE NOSSOS.
- Nunca diga o nome do canal em uma narração ou descrição.
Regras do usuário que se aplicam:
- Sem legendas ou etiquetas no vídeo.
- Apenas inglês.
- Narração: um tom constante.
- Piadas são fatos reais pesquisados.
- Mixagem padrão: música +3 dB, SFX -6 dB, voz inalterada.
- Exportação final 2K vertical: 1440x2560,
--scale 1.3333. - Opus max verifica cada etapa.
- Salvar após cada etapa.
- "Apenas faça" assim que o roteiro for aprovado.
Pipeline
- Tópico e fatos. Escolha uma história surpreendente e verdadeira com causa e efeito físicos (deve ser visual), além de uma analogia cotidiana simples que a explique.
- Escreva os fatos com sua fonte no topo de
SCRIPT.md.
- Escreva os fatos com sua fonte no topo de
- Roteiro (~3,7 palavras/s, 55-70 s). Fórmula de batidas do curta da ponte:
- Gancho: o fato absurdo em uma linha ("Setenta e quatro soldados derrubaram uma ponte de ferro apenas atravessando-a.").
- Cenário: ano, lugar, orgulho.
- Ação: escalada em três ou quatro batidas, cada uma um pouco maior.
- Estalo: o momento em que quebra.
- Linha dupla sem expressão: "Felizmente... / Infelizmente...".
- Explicação: uma ideia física através de uma analogia cotidiana (a criança no balanço).
- Consequência: a regra que criou.
- Reviravolta de retorno: o final.
- Nunca descreva na tela o que o espectador já vê.
- Narração. Grave ou gere
voice.wav, depois crie suas marcações de palavraswords.json(qualquer serviço de fala para texto com tempos de palavras).- Coloque-os na pasta do projeto, ex.:
~/bridge-short/voice/. - Corrija manualmente as marcações de palavras. Tudo é sincronizado com words.json.
- Coloque-os na pasta do projeto, ex.:
- Plano de cena em
story.ts: copietemplates/bridge/(o código fonte final da ponte, o mesmo quesrc/videos/bridge/do seu projeto Remotion) parasrc/videos/<name>/, registre uma nova composição ao lado deBridgeShortemsrc/Root.tsx, e renomeie-a.SHOTS: id, quadros a/b, luz dia/dourada, modo multidão,tautempo da história.XFADE: crossfades em mudanças de lugar/tempo.FLASH_AT: um flash branco após o gancho.CAMS: chaves por cena{f, dur?, cut?, s: f => {pos, look, fov, roll}}.KICKS: impactos com flip-shakes.DOF/dofAt: desfoque de lente por batida.FOREGROUND: adereços de enquadramento próximos.- Toda reação visual ocorre 0-3 quadros antes de sua palavra.
- Mundo.
lights.ts: LIGHTS mais a paleta de céu/rio/nuvem LOOK por luz.shade.ts: sombreamento de dois tons euntone().build.ts: cidade, casas e adereços do kit Kenney CC0, recoloridos, com poda de linha de visão de qualquer coisa bloqueando uma câmera.paint.ts: texturas pintadas em Canvas2D HD com costuras pintadas como tons escuros.world.ts: shader de céu, neblina = cor do horizonte, rio, pose por quadro, sol congelado por cena e relativo à câmera.
- Personagens.
toon.ts: a API de desenho Canvas2DPen, tela de design 600x1000, solas em y = 975, cabeças de feijão, membros de palito, contorno de largura variável em ameixa, biblioteca de rostos.cast.ts: painéis voltados para a câmera, multidões, cartões de efeito, piscadas, ciclos de caminhada. Todos os painéis vão na camadaNOINK.cardshade.ts: cartões iluminados pela luz da cena, sem emissão.
- Pós-produção (
Bridge.tsx+ink.ts+lensblur.ts+grade.ts).- Ordem do compositor: ink → lens pre → lens main → bloom → mapa de tom NEUTRO → grade (MSAA 4).
- Todo parâmetro de pixel escala com altura da saída / 1920.
- Som (
~/bridge-short/audio/: timeline.py, sfx_gen.py, sfx.py, music.py, instruments.py, dsp.py, mix.py).- Tabela de eventos → SFX sintetizados mais uma trilha original com duck sob a narração.
- Saída: mix.wav (48 kHz, duração exata), stems e cues.md.
- Trave as constantes de tempo do vídeo antes de fazer o som. Qualquer mudança de tempo posterior significa reexecutar o som.
- Verificações de aparência. Execute
node scripts/bridge-stills.mjs out/<name>/x_ 100,400 0.5.- Defina
BRIDGE_ENTRY=src/sandboxes/<n>/index.tsxpara renderizar uma cópia sandbox. - Faça comparações lado a lado com quadros de referência usando
python scripts/sbs_sheet.py out.jpg --ours ... --ref .... - Envie-os para um verificador Opus max: 1-3 imagens, um veredito de ≤200 palavras.
- Defina
- Renderização final.
npx remotion render src/index.ts <Comp> out/<name>/video.mp4 --codec h264 --crf 16 --scale 1.3333- Mux com
-map 0:v:0 -map 1:a:0(Remotion escreve uma faixa de áudio silenciosa). - QA:
python scripts/short_qa.py final.mp4 out/<name>/qa shots.jsonverifica cada quadro em busca de quadros pretos, brancos, congelados e pop, além de volume e folhas. - Corrija qualquer coisa que encontrar, então execute uma auditoria Opus profunda.
- Entrega. Envie para o usuário o mp4 final, atualize a memória, escreva notas.
Valores finais de aparência (ponte após 4 rodadas de verificação; todos em templates/bridge/)
Comece cada novo curta a partir de templates/bridge/ (copie para src/videos/<name>/): a aparência vive nesses valores, a história vive em story.ts / layout build.ts / papéis cast.ts. Pontuações Opus max no final: cor dia 7, dourado 5-6, iluminação 5-6, tinta 6, texturas 5-6, personagens 7, profundidade 6-7, composição 6-7 (de 5/3/4/5/4/7/4/6 no início).
- Predefinições de luz (
lights.ts, sol relativo à câmera e congelado por cena):- dia: az 75 / el 48, lit [1.58,1.5,1.33], shade [.30,.29,.36], lift [.05,.06,.11] (tom frio SOMENTE na sombra), céu topo #3e7fd2 → horizonte #b8d0ec, neblina = horizonte, 25→300 m, uSat 1.08, ~15 % névoa azul além de 60 m.
- dourado: az 6 / el 7 (sol baixo contraluz), key em direção a #FFB36B ×1.5, sombra violeta-azul (fachada ≈ #444380), céu #ffc47c → #8a6f8a, neblina pêssego apenas além de 50 m, disco solar #ffcf9e + bloom, bolhas de contato + sombras reais de cartão.
- Albedos (
paint.ts/build.ts): casas em tijolo suave / creme / ocre / terracota com plinto, cornija, peitoris, capuz, degrau da porta, chaminé + vaso, alturas 7 / 8.4 / 9.8 m; pedra cinza quente/bege (saturação −35 % de "storybook"); deck de madeira ocre C* ~51-58 com costuras quase pretas; ferro escuro e dessaturado. Nunca limão, nunca faces iluminadas em lavanda. - Tinta (
ink.ts): #030303, 5.1 px perto (6 m) → 3.3 px longe (90 m) a 1080x1920, dobras ×0.8 a partir de 35°, saltos de profundidade de 1 %, matiz de neblina 0.3 apenas longe; cartões de personagem na camadaNOINK(eles carregam sua própria tinta ameixa). - Lente (
lensblur.ts+dofAtem story.ts): cInf px a 1080: gancho/rio CU 15-16, close-ups 12-14, MS 10-12, parque 7, balanço dourado 5, abertos/aéreos 0. Foco nos olhos da primeira fila. - Pós-produção (
Bridge.tsx): ink → lens pre → lens main → bloom (limiar 1.0, int .5, 6 níveis, raio .6) → mapa de tom NEUTRO → grade; MSAA 4. Grão de filme existe mas está DESLIGADO (a referência não mede grão; ele quadruplica o tamanho do arquivo). - Personagens (
toon.ts/cast.ts/cardshade.ts): cabeças de feijão a/l .94, tinta ameixa #241726, olhos .26 W de distância, sem blush, 14 expressões; adultos 3.5 alturas de cabeça; balanço de caminhada 5 %, inclinação 1-7°, passada plantada 0.8 m; piscadas 0.5-2.3 s; sombra de contato apertada ~.5 sob os pés + cauda na direção do sol durante o dia; aro dourado apenas interno (nunca uma cópia externa deslocada). - Câmera (
story.ts): cortes em grandes saltos, deslizamentos smootherstep 18-40 f, cada parada se move (nenhuma parada estática ≥4 f), kicks flip com decaimento em 7 f em impactos, rotações 4-4.6°, adereços de primeiro plano (FOREGROUND) em ~1/3 das cenas.
Alvos de aparência (medidos a partir da referência; veja references/reports/)
- Tinta:
- Linhas do mundo: cerca de 3 px a 1080 de largura, quase preto #0b0a0c, quase constante com a distância. Apenas silhuetas, saltos de profundidade e dobras normais. Sem linha em juntas de parede/piso ou no horizonte. Cartões de personagem nunca são contornados pela tinta do mundo.
- Tinta do personagem: ameixa escura #201628-#2f1d28, mais grossa no lado inferior/sombra.
- Cor:
- Luminância mediana do dia ~.57. Não-tinta p5 ~.23 (sem pretos esmagados). Croma iluminado C* p90 ~55. Topo do céu do dia ~#5e93d9, horizonte 1.28x mais brilhante.
- Dourado: horizonte pêssego #ffd08a, sombras violeta-azul (nunca marrom), sol contraluz.
- Profundidade:
- DOF em cerca de 1/3 do tempo de tela (CU, MS, inserts), cInf 10-16 px a 1080, foco nos olhos. Cenas de estabelecimento e abertas permanecem nítidas.
- Neblina = cor do horizonte, 25→420 m dia, 20→360 m dourado.
- Bloom apenas em emissivos HDR: limiar 1.0.
- Câmera:
- Cortes duros em grandes saltos. Todo o resto é um deslizamento smootherstep de 18-40 f, pico ≤ 25 px/f a 720p.
- Cada parada avança 0.15-0.35 %/f, com 0.6 %/f em palavras de impacto.
- Rotações de 4-5°.
- Sem flutuação de câmera na mão. Impactos shake flipam o sinal a cada quadro e decaem em 7 f.
- Personagens:
- Cerca de 3.5 alturas de cabeça, pernas 1.4 HH.
- Membros de palito cerca de 0.055 da largura da cabeça, mãos de ponto de tinta.
- Cabeça de feijão (a/l ~0.93, queixo mais estreito, coroa mais pontiaguda).
- Sem blush ou realces nos olhos. Faces no brilho ~.93.
- Balanço de caminhada 3-7 %, inclinação 1-7°, pés plantados.
- Piscadas a cada 0.5-2.3 s, durando 4 f.
Loop de correspondência de aparência (como a aparência da ponte foi alcançada; reutilize para qualquer passe "faça parecer com X")
- Meça a referência primeiro. Um agente de análise por tópico (movimento, profundidade, texturas, personagens, iluminação, contornos, grade), cada um escrevendo números, não adjetivos, para
references/reports/<topic>.md. Briefing compartilhado:compare/CONTEXT.md. Relatórios são a fonte da verdade para todo agente depois. - Sandboxes, um proprietário por arquivo. Copie a pasta do projeto para
src/videos/<name>_{cam,world,mat,char,post}com entradassrc/sandboxes/<n>/index.tsx(mesmoindex.tsxdo principal, apenas o caminho de importação alterado). Propriedade usada para a ponte:- cam: story.ts (chaves de câmera, cortes, kicks, tabela DOF, adereços de primeiro plano)
- world: world.ts, lights.ts, shade.ts, grade.ts (sol, céu, neblina, rio, cor, grade)
- mat: paint.ts, build.ts (texturas pintadas, edifícios, adereços)
- char: toon.ts, cast.ts, cardshade.ts (desenho de personagem, pose, iluminação de cartão, cartões de efeito)
- post: ink.ts, Bridge.tsx, lensblur.ts (passe de contorno, compositor, desfoque de lente, bloom)
Agentes editam apenas seus próprios arquivos em sua própria sandbox e renderizam imagens com
BRIDGE_ENTRY=src/sandboxes/<n>/index.tsx node scripts/bridge-stills.mjs out/<name>/<n>/x_ <frames> 0.5.
- Mesclar com
python scripts/bridge_merge.py [cam,world,mat,char,post](faz backup do principal parabackup/bridge_<time>/, copia apenas arquivos de propriedade). Entãonpx tsc --noEmit(filtre para a pasta do projeto), depois ressincronize cada sandbox a partir do principal (cp -f src/videos/<name>/* src/videos/<name>_<n>/) antes da próxima rodada. - Verifique com um novo agente Opus max: folhas lado a lado (
python scripts/sbs_sheet.py out.jpg --ours a b --ref r1 r2), pontue cada área de 0 a 10 (cor dia / dourado, iluminação, tinta, texturas, personagens, profundidade, composição) mais uma lista numerada de correções com números de quadro. Mapeie cada correção ao proprietário do arquivo e retome o agente desse proprietário com SendMessage (mantém seu contexto). Pontuações da ponte: rodada 1 5/3/4/5/4/7/4/6 → rodada 2 5/4/5/6/4/7/6/6 → rodada 3 veja notas. - Contratos entre proprietários vivem em constantes exportadas (ex.: camada
NOINKde ink.ts,dofAt/FOREGROUNDde story.ts,LIGHTS/LOOKde lights.ts). Mudar um contrato significa informar todo proprietário que o lê.
Armadilhas
- Os materiais do kit de natureza Kenney são verde-azulados: recolorir por nome de material em build.ts.
- Câmeras podem parar dentro de casas: o podador de linha de visão em build.ts/world.ts remove qualquer coisa que bloqueie qualquer raio de câmera.
- Tinta no mesmo passe de efeito mesclado que DOF é sobrescrita. A tinta deve ser seu próprio passe antes do desfoque.
- Parâmetros de pós-produção em tamanho de pixel devem escalar com a resolução: imagens são 0.5, o final é 1.333. R3F fixa dpr para ≥ 1, então
--scale 0.5imagens ainda renderizam um buffer 1080x1920. - Disco: cada pacote Remotion copia
public/(~1.3 GB) parana pasta temp\remotion-webpack-bundle-*e nunca o exclui. 60+ GB encheram o disco do sistema durante os passes da ponte e uma renderização morreu com ENOSPC. Sempre renderize comexport TEMP='<drive grande>/remotion-tmp' TMP='<drive grande>/remotion-tmp'(bridge-stills.mjs define isso sozinho) e peça ao usuário antes de excluir pastas de pacote antigas na pasta temp compartilhada (modo automático bloqueia a varredura). /remotion-tmp também enche (~500 pastas / 110 GB após as 4 rodadas da ponte): quando um projeto está concluído e nada está renderizando, exclua suas pastasremotion-webpack-bundle-*epuppeteer_dev_chrome_profile-*lá. - Em strings JS escreva
"<drive grande>/remotion-tmp", nunca"<drive grande>\remotion-tmp"(\rse torna um retorno de carro). - Remotion escreve uma faixa de áudio silenciosa: mixe com
-map 0:v:0 -map 1:a:0. - Subagentes não podem escrever arquivos de relatório neste harness: peça a eles uma mensagem final de ≤150 palavras e salve você mesmo em
out/<name>/<n>/REPORT.md. - Arquivos
.tsde rascunho dentro deout/quebramtsc: nomeie-os como.txt. - Renderizações 2K rodam a ~4 fps (≈10 min para 67 s). Imagens a 0.5 levam 3-8 s cada após um pacote de ~40 s.
- Grão de filme a 2.5 % fez o arquivo 2K ter 910 MB em vez de ~250 MB e se tornará uma bagunça no YouTube; a referência não tem nenhum. Mantenha-o desligado.
Armadilhas de legibilidade que o verificador pegou (verifique cada novo adereço/cena para estes)
- Um balanço desenhado como uma corda que desaparece atrás da criança parece um ENFORCADO. Sempre duas cordas para uma tábua larga com a criança entre elas (
swingKidem toon.ts), e um quadro cujas pernas limpam o arco (A-frame em cada extremidade). - Adereços ou detritos a menos de ~2 m de uma lente se tornam bolhas enormes cortadas na borda do quadro. Quando uma câmera se move, verifique novamente cada adereço perto de sua nova posição (as câmeras do rio se moveram para dentro dos chapéus flutuantes).
- Um arbusto de primeiro plano cortado pela borda do quadro parece uma "bola verde"; um adereço de primeiro plano deve ser reconhecível ou removido.
- Bandeiras: vermelho + estrela/diamante amarelo parece com a do Vietnã. Use uma bandeira historicamente correta (Cruz de São Jorge para a Inglaterra 1831).
- Dor
…
[truncado para tradução]