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.

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.
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.
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).
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.
A voz é gerada localmente (chatterbox, pelo inemavox); os tempos de cada frase guiam os planos de câmera e a legenda.
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.
O motor comum: materiais PBR, caixas, carregamento dos modelos, planos de câmera, path tracing por quadro e legenda palavra a palavra.
Cada vídeo é uma composição: monta a cena e diz quando cada peça entra e para onde a câmera vai.
Render completo, filtro de ruído, junção da narração e uma cópia leve (até 44 MB) para mandar no Telegram.
Testado num NVIDIA GB10 (DGX Spark) com Linux ARM64. Qualquer GPU com Vulkan deve servir; só muda o tempo.
Para o Remotion e o three.js.
node -vO render usa --gl=angle (GPU de verdade). --gl=swangle cai para a CPU e fica muito lento.
vulkaninfo --summaryFiltro de ruído, junção da voz e compressão final.
ffmpeg -versionOs comandos abaixo são os mesmos usados para gerar os dois vídeos desta página.
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
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
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
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.
Mais amostras = menos grão e mais tempo. Medido no GB10 a 1080×1920:
| Configuração | Tempo por quadro | Uso |
|---|---|---|
spp 64 · bounces 4 | ~5 s | vídeo final (com filtro de ruído) |
spp 256 · bounces 6 | ~27 s | quadro de capa, sem grão |
Os dois vídeos foram renderizados inteiros nesta máquina, sem nenhum quadro gerado por IA.
O que já foi feito e o que vem a seguir.