3D zoom explainer
Um formato que explica escala melhor do que qualquer gráfico: comece em um objeto que todos conhecem, voe para dentro dele sem um único corte, mantenha um número na tela que diga ao espectador até onde ele foi, e termine com um fato inesperado. O resultado de referência para esta skill é "Nothing is really sharp": uma lâmina de barbear, 26 divisões pela metade, um átomo de ferro, e a informação de que sua aresta ainda tem cerca de 300 átomos de largura.
assets/template/ é esse projeto finalizado. Comece a partir dele em vez de um arquivo vazio: as partes difíceis (zoom de oito ordens de grandeza sem perda de precisão, detalhes que mudam com a escala, profundidade de campo, um renderizador determinístico) já estão resolvidas ali e levaram várias rodadas para ficar corretas.
A fórmula
Mantenha todos os cinco. Cada um está fazendo trabalho.
- Uma tomada contínua. O ponto principal é que o espectador nunca perde a referência. Um corte redefine sua percepção de escala.
- Uma medição ao vivo. Uma barra fina ancorada no assunto, um número que muda a cada quadro, uma contagem de divisões pela metade (ou duplicações) e duas ou três palavras para o que está à vista. A barra é a única coisa que o espectador precisa ler, então ela deve ser honesta: seu comprimento na cena realmente é o número mostrado.
- O assunto muda de caráter em cada escala. Polimento se torna marcas de retífica, depois lascas, depois grãos cristalinos, depois uma borda arredondada, depois átomos. Se a superfície parece igual por três segundos, o zoom parece que nada está acontecendo.
- Objetos para escala. À medida que o zoom passa por cada tamanho, um objeto familiar daquele tamanho fica ao lado do assunto com seu nome e tamanho: grão de sal, cabelo, glóbulo vermelho, bactéria, vírus, transistor, anticorpo, DNA. Eles transformam um número abstrato em "menor que um vírus".
- Um desfecho. Volte rapidamente para onde começou e mostre o único número para o qual a viagem foi feita.
Fluxo de trabalho
1. Pesquise antes de modelar
O vídeo só vale a pena ser feito se for verdadeiro. Pesquise as dimensões reais (busca na web, fontes primárias quando possível) e anote, para o assunto e para cada objeto de escala: o tamanho, a fonte e qualquer simplificação que você esteja fazendo. A geometria é então construída a partir desses números, para que a imagem não se afaste dos fatos. Reporte as fontes e simplificações ao usuário no final; será solicitado.
Escolha de 6 a 9 objetos de escala, cada um pelo menos cerca de 3x menor que o anterior. Mais próximos que isso e seus rótulos colidem; mais distantes que cerca de 30x e a tela fica vazia por segundos.
2. Mostre o plano quando for útil
Se o usuário pediu para ver o plano primeiro, ou se o briefing deixa escolhas reais em aberto (narração ou silencioso, idioma, qual é o desfecho), forneça uma pequena tabela: tempo, escala, o que está à vista, objeto para escala. Caso contrário, prossiga; um plano que ninguém pediu só atrasa a primeira renderização.
3. Configure o projeto
cp -r <skill>/assets/template <project>/ && cd <project> && npm install
node render.mjs --stills 1,10,20,30,40
O segundo comando deve imprimir o nome da GPU e escrever cinco JPEGs em out/. Se ele reportar SwiftShader ou llvmpipe, a renderização está na CPU e levará horas: corrija as flags da GPU antes de prosseguir (veja references/pitfalls.md).
4. Adapte a cena
main.js é um arquivo único, em seções. Leia references/techniques.md antes de mudar algo estrutural; ele explica por que cada parte é construída da maneira que é. O que geralmente muda para um novo tópico:
Seção em main.js | O que substituir |
|---|---|
| constants | Dados físicos em metros, tamanho inicial L0, número de divisões HMAX, linha do tempo |
| subject surface | A seção transversal prof(), o recorte do contorno, a tabela de características da superfície FEATS (comprimento de onda, tipo, intensidade) |
| finest scale | A rede atômica (ou o que quer que seja o último estágio) |
| things for scale | A lista addObj(name, sizeText, sizeInMetres, geometry, material, placement) |
| overlay | LABELS (o que está à vista em cada nível de zoom), a legenda final |
| camera keys | K_AZ, K_EL, K_TY, K_D, K_AP como funções do nível de zoom |
Para um assunto com formato diferente (um chip, uma folha, uma folha de papel), mantenha a mecânica e substitua o perfil e as características. Para um zoom para fora, execute a mesma linha do tempo ao contrário e diga "dobrado".
5. Olhe os stills antes de renderizar o filme
Renderize de 8 a 10 stills distribuídos ao longo da linha do tempo, organize-os em folhas de contato com ffmpeg e leia-os. Depois corrija o que você vê e repita. Este ciclo é de onde vem a qualidade; todo problema na primeira versão do filme de referência era visível nos stills e nenhum deles era visível no código. Verifique em particular:
- Exposição. A primeira passagem quase sempre estoura. Metal deve ser principalmente escuro com realces definidos.
- Qualquer coisa cortada pela borda do quadro, especialmente objetos de escala perto do topo.
- Rótulos sobre áreas claras ou uns sobre os outros. Mantenha o rótulo de medição em preto vazio.
- Se cada estágio parece com o que seu rótulo diz. Se o rótulo diz "grãos" e a imagem é listras, um dos dois está errado.
- O primeiro e o último quadro, já que esses são a miniatura e a conclusão.
ffmpeg -y -i a.jpg -i b.jpg -i c.jpg -i d.jpg -filter_complex "[0][1]hstack[t];[2][3]hstack[u];[t][u]vstack,scale=1920:-1" sheet.jpg
6. Renderize e verifique o resultado
node render.mjs --full --o video.mp4 # adicione --audio vo.wav se houver narração
Execute em segundo plano; um filme de 45 segundos em 1080p leva alguns minutos em uma GPU discreta. Depois verifique o arquivo em si, não os stills que você fez antes: verifique duração e tamanho, extraia uma grade de visão geral e extraia seis quadros consecutivos de uma seção movimentada para procurar cintilação. Detalhes processuais finos comprimem mal, então espere arquivos grandes e faça uma cópia menor quando necessário:
ffmpeg -i video.mp4 -vf "fps=1/3,scale=640:-1,tile=4x4" -frames:v 1 overview.jpg
ffmpeg -ss 13 -i video.mp4 -vf "crop=960:540:480:270,tile=3x2" -frames:v 1 consecutive.jpg
ffmpeg -i video.mp4 -vf scale=1280:720 -c:v libx264 -preset slow -crf 25 -maxrate 4200k -bufsize 8400k small.mp4
Diga claramente o que você verificou e o que não verificou. Grades de quadros provam que a imagem está correta; elas não provam que o movimento parece correto, então diga que o usuário deve assistir.
Padrões
- Silencioso. Sem música, sem efeitos sonoros, sem narração a menos que solicitado. O formato se sustenta sozinho, e a referência da qual veio não tinha narração.
- Texto é apenas dados e nomes. A medição, a contagem de divisões, o que está à vista, os nomes e tamanhos dos objetos de escala, um número final. Se a narração for adicionada, remova todo rótulo que a voz já diz, porque ler e ouvir as mesmas palavras divide a atenção.
- 1920x1080, 30 fps, 40 a 50 segundos, renderizado a 1.5x e reduzido. Para vídeo vertical, mude
WeHe verifique cada still novamente; a composição não se transfere sozinha. - Rótulos no idioma do público do usuário, que nem sempre é o idioma em que estão conversando. Pergunte se não estiver claro.
Adicionando uma narração
Apenas quando solicitado. Escreva o roteiro como linhas curtas que pertencem a um estágio cada, gere ou receba o áudio, obtenha as temporizações das palavras (faster-whisper funciona bem) e então direcione o zoom a partir do áudio: o nível de zoom se torna uma função keyframed do tempo que pausa enquanto uma linha explica um estágio e viaja entre as linhas. Passe o áudio para render.mjs --audio. Deixe algo pequeno acontecer durante cada pausa (um varredura de luz, um objeto chegando, átomos vibrando), caso contrário um zoom pausado parece congelado.
Arquivos de referência
references/techniques.md- como o template funciona e por que: escala em torno do ponto focal, detalhe processual com janela de escala, impostores esféricos, profundidade de campo, objetos ancorados no espaço físico, o renderizador determinístico. Leia antes de mudanças estruturais.references/pitfalls.md- falhas já encontradas e suas correções. Leia quando uma renderização parecer errada ou uma ferramenta se comportar mal.MASTER_PROMPT.md- um prompt preenchível para iniciar um novo vídeo, além de ideias de tópicos que se encaixam na fórmula.