Vídeo 3D por código · sem IA de vídeo

Crie vídeo animado com código

Um quarto e uma casa montados peça por peça, com luz de verdade calculada na placa de vídeo e narração em voz local.

Banner: reel 3D por código, quarto montado peça por peça
Em resumo

O reel3d é um projeto que faz vídeos curtos em 3D (formato 9:16, de celular) escrevendo a cena em código, sem usar gerador de vídeo por inteligência artificial. Cada móvel é uma peça com medida real, que entra animada no lugar; a luz é calculada por path tracing (simulação de como a luz bate e rebate nas superfícies) na placa de vídeo. Serve para quem quer mostrar ambientes, produtos ou ideias com controle total de câmera e de tempo. Para rodar, você precisa de Node.js, de uma placa de vídeo e de paciência: cada quadro leva alguns segundos.

O que é

Uma cena que você escreve, não que você sorteia

Em vez de pedir um vídeo para uma IA e torcer, você descreve o ambiente em TypeScript. Tudo fica repetível: mesmo código, mesmo vídeo.

Banner com as partes do projeto: cena em código, path tracing, móveis CC0, narração local

🧱 Cena em escala real

Paredes, cama, armários e bancadas são caixas com medidas em metros; modelos prontos (sofá, plantas, luminária) vêm do Poly Haven, de uso livre (CC0).

💡 Luz fotorrealista

three-gpu-pathtracer acumula 64 amostras por quadro com 4 rebatimentos de luz, e um filtro de ruído limpa o grão no fim.

🎙️ Narração sincronizada

A voz é gerada localmente (chatterbox, pelo inemavox); os tempos de cada frase guiam os planos de câmera e a legenda.

Como funciona

Do roteiro ao MP4

O Remotion abre a cena num navegador sem tela, o three.js monta o 3D e o path tracer calcula a luz quadro a quadro.

Roteiro (.txt)→ Narração por frase→ tempos.json→ Cena + câmera (src/)→ Path tracing na GPU→ Filtro de ruído→ MP4 com voz

src/engine.tsx

O motor comum: materiais PBR, caixas, carregamento dos modelos, planos de câmera, path tracing por quadro e legenda palavra a palavra.

src/Quarto60.tsx · src/Casa90.tsx

Cada vídeo é uma composição: monta a cena e diz quando cada peça entra e para onde a câmera vai.

produz.sh

Render completo, filtro de ruído, junção da narração e uma cópia leve (até 44 MB) para mandar no Telegram.

Pré-requisitos

O que precisa ter

Testado num NVIDIA GB10 (DGX Spark) com Linux ARM64. Qualquer GPU com Vulkan deve servir; só muda o tempo.

Node.js 20+

Para o Remotion e o three.js.

node -v

GPU com Vulkan

O render usa --gl=angle (GPU de verdade). --gl=swangle cai para a CPU e fica muito lento.

vulkaninfo --summary

ffmpeg

Filtro de ruído, junção da voz e compressão final.

ffmpeg -version
Guia de uso · passo a passo

Renderize o quarto e a casa

Os comandos abaixo são os mesmos usados para gerar os dois vídeos desta página.

1

Baixe o projeto e as dependências

As texturas e modelos (217 MB, CC0) não vão no repositório: o script baixa tudo do CDN do Poly Haven para public/ph.

git clone https://github.com/inematds/reel3d-teste
cd reel3d-teste && npm install
node baixa-assets.mjs public/ph   # 132 arquivos
2

Confira um quadro antes do vídeo

Um quadro solto com poucas amostras mostra se a cena, a luz e a câmera estão certas. Com debug, o tempo de cada etapa sai escrito na imagem.

npx remotion still src/index.ts Quarto60 out/teste.jpg --frame=300 --gl=angle --props='{"spp":16,"debug":true}'
bash stills.sh Quarto60 16   # um quadro por plano + folha de contato
3

Grave a narração (opcional)

Uma linha do narr/quarto.txt por frase. O gera.sh usa o TTS local do inemavox; troque pela sua voz de referência. O monta_audio.py junta as frases e grava os tempos em narr/tempos.json; depois de transcrever cada WAV com Whisper (palavra a palavra), a segunda etapa grava as palavras da legenda.

bash narr/gera.sh
python3 narr/monta_audio.py             # frases → quarto.wav, casa.wav
python3 narr/monta_audio.py --palavras  # palavras da legenda
4

Renderize o vídeo completo

Uma aba só (uma GPU), teto de memória de 24 GB e 6 h de limite. Termina com o filtro de ruído e a narração no MP4.

bash produz.sh Quarto60 "quarto 60 s"
bash produz.sh Casa90 "casa 90 s"
grep -a "Rendered" out/render.log | tail -1   # progresso

O último passo do produz.sh manda o vídeo para um bot do Telegram local; sem ele, o MP4 final fica em out/<nome>-v1-final.mp4.

5

Ajuste a qualidade

Mais amostras = menos grão e mais tempo. Medido no GB10 a 1080×1920:

ConfiguraçãoTempo por quadroUso
spp 64 · bounces 4~5 svídeo final (com filtro de ruído)
spp 256 · bounces 6~27 squadro de capa, sem grão
Vídeos

O que já saiu daqui

Os dois vídeos foram renderizados inteiros nesta máquina, sem nenhum quadro gerado por IA.

Quarto 8 m² · 64 s. Guarda-roupa até o teto, mesa corrida na janela, cama elevada com gavetas que viram degraus. Render: 3 h 44.
Casa térrea · 87 s. Da fachada para dentro: sala integrada, cozinha em linha e, no fim, o mesmo quarto. Render: 5 h 26.
Próximos

Para onde vai

O que já foi feito e o que vem a seguir.

Feito
Quarto 10 s, Quarto 60 s e Casa 90 sMotor comum, legenda palavra a palavra, narração com voz local e render completo na GPU.
Próximo
A mesma cena no BlenderRefazer o quarto e a casa com o Blender sem tela (Cycles), para comparar qualidade, tempo de render e custo de montagem.