Vídeo de produto no Blender
Um método e um exemplo funcional para um filme de produto de 45 a 75 segundos que se lê com o som desligado. Um cenário fotorrealista (grama, um portão de madeira, um céu real) carrega uma metáfora visual. Sobreposições curtas de texto dizem o que as imagens não conseguem. O filme termina se transformando em um grid plano de blocos coloridos que viram para soletrar o título e a chamada para ação.
Tudo é código: o cenário, a animação, a composição. Nada é aberto em uma GUI.
O que há nesta pasta
| Caminho | O que é |
|---|---|
film.json | Paleta, texto de sobreposição com temporizações, linhas finais. Edite isso primeiro. |
scripts/blender/build.py | O cenário: colina com grama de partículas de cabelo, portão, blocos foscos, céu, neblina, configurações de render. |
scripts/blender/mascot.py | Personagem de exemplo: uma coruja voxel pequena o suficiente para sentar em um poste de cerca. |
scripts/blender/film.py | Planos, câmeras, animação quadro a quadro. Renderiza plates e layers. |
scripts/post/comp.py | Compositor: plates + layers, movimentos de câmera 2D, texto, correção de cor, final em blocos 2D, codificação ffmpeg. |
assets/ | Duas placas de céu (dourado, nublado). Substitua pelas suas. |
examples/ | Quadros de um filme feito com este pipeline. |
O filme de exemplo é "O Portão": blocos idênticos rolam por um portão aberto em um ritmo constante, então chegam em todos os tamanhos, depois enxameiam. O portão se fecha, e depois disso os blocos são deixados passar, contados ou parados. Trate-o como uma referência para a estrutura, depois substitua a metáfora por uma que se encaixe no produto.
Fluxo de trabalho
Faça na seguinte ordem. Obtenha aprovação em cada etapa numerada antes de gastar tempo de renderização na próxima.
- Briefing. Uma frase cada: para quem é, o problema, a mudança, a promessa, a chamada para ação. Decida a duração (45 a 75 s), o aspecto e onde será exibido. Presuma reprodução sem som.
- Metáfora. Escolha uma imagem física para o problema e uma mudança nessa imagem para o produto. Um lugar, um objeto principal, um tipo de objeto em movimento. Se precisar de explicação, escolha novamente.
- Storyboard. 6 a 8 planos. Para cada: duração, o que se move, a linha de sobreposição (menos de 8 palavras, uma ideia), posição e lente da câmera. Ato do problema em luz fria e nublada, ato do produto em luz quente. Mostre como uma tabela e obtenha aprovação.
- Personagem (opcional). Um pequeno protagonista dá ao olho um lugar para descansar. Ofereça 3 ou 4 opções como esboços planos antes de modelar qualquer coisa. Dimensione-o em relação ao cenário: deve caber no objeto principal. Construa-o a partir de primitivas simples (a coruja tem cubos de 1 cm).
- Cenário em código. Adapte
build.py. Mantenha as unidades em metros com o objeto principal na origem. Renderize um still de cada plano com amostras baixas e olhe para cada um antes de animar. - Animação. Em
film.py, cada plano temsetup_X(criar objetos uma vez) eupdate_X(t)(posicionar tudo para o segundo de filmet). Funções puras do tempo, sem keyframes, para que qualquer quadro possa ser renderizado sozinho e uma renderização interrompida retoma de onde parou. - Renderização em duas passagens.
python scripts/blender/film.py plates, depois... layers. Veja abaixo. - Composição.
python scripts/post/comp.py out.mp4 --draftpara uma verificação rápida (a cada 6 quadros), depois sem--draft. Use--only-endingenquanto ajusta o final. - Assista. Extraia stills no ponto médio de cada sobreposição e verifique: o texto é legível, a
coisa que o texto nomeia está visível no quadro, algo aparece entre os planos. Corrija e re-renderize apenas
o plano afetado (delete seus arquivos em
layers/).
A renderização em duas passagens
Grama fotorrealista é lenta. Objetos em movimento são baratos. Portanto, são renderizados separadamente.
- Plates. Um still por plano do cenário completo (grama, objeto, céu), 1280x720 com 36 amostras no exemplo. Um plano que muda de luz recebe duas plates que o compositor faz cross-fade.
- Layers. Apenas o que se move, em um fundo transparente, em resolução e amostras menores. O chão é um shadow catcher para que os objetos ainda projetem sombras. Objetos estáticos são holdouts para que os objetos passem atrás deles corretamente. O céu permanece para iluminação, mas fica escondido da câmera.
- Compositor. Coloca a layer sobre a plate, então simula movimento de câmera com um push ou drift 2D lento por plano. Uma câmera 3D travada é o que torna a plate reutilizável.
Três coisas mantêm o custo baixo:
- Loops. Se um plano é um fluxo constante, torne o movimento periódico (espaçamento 0.84 m a 0.84 m/s
repete a cada segundo) e renderize um período.
LOOPemfilm.pyecomp.pylista esses planos. - Em pares. Layers são renderizadas a cada dois quadros (
STEP = 2) e mantidas. Lê-se como stop motion, que combina com objetos pequenos e blocos. - Retomada. Cada quadro é ignorado se seu arquivo existir.
Para escala: o filme de exemplo (51 s de 3D mais um final de 12.5 s) é 8 plates e 456 quadros de layers. Renderizou apenas em CPU.
O final 2D
comp.py desenha diretamente, sem Blender. Um grid de 64x36 quadrados arredondados na paleta voa para
dentro sobre o último quadro 3D com 6 colunas de largura, a câmera se afasta até que todas as 64 colunas apareçam, então
uma onda diagonal vira cada bloco (um squash vertical até zero e de volta, com a troca de cor no
ponto médio) para sua cor final. As cores finais vêm de uma fonte de 3x5 pixels, então os blocos se tornam o
texto.
Limites para planejar a cópia: até quatro linhas, 12 caracteres cada (11 parece melhor), maiúsculas,
dígitos e . - / !. Defina-os em film.json sob ending com uma linha do grid e uma chave de paleta.
Editando film.json
palette: sete cores hex.primary,accent,warm,soft,deep,paper(fundo do final e o bloco padrão),alarm(a cor de "algo está errado").overlays:[início, fim, "texto", x]em segundos de filme.xé opcional, uma posição horizontal de 0 a 1 para quando o assunto está onde o texto centralizado o cobriria. Use\npara duas linhas.ending: as linhas que os blocos soletram.font: caminho para um .ttf ou .otf para sobreposições. Cai para Inter, DejaVu, Helvetica ou Arial.
As durações dos planos vivem em SHOTS no topo de film.py e comp.py. Mantenha-as iguais.
Setup
python -m venv venv && . venv/bin/activate
pip install bpy==5.3.0 numpy pillow # bpy é o wheel do Blender; precisa do Python correspondente
# ffmpeg deve estar no PATH
TEST=1 python scripts/blender/film.py plates # 480x270, um quadro por plano, alguns minutos
TEST=1 python scripts/blender/film.py layers
python scripts/post/comp.py draft.mp4 --draft
FILM_OUT=/algum/dir escreve plates/ e layers/ lá em vez de nesta pasta. FILM_CONFIG
aponta para um film.json diferente. GRASS_NEAR e GRASS_MID (porcentagem) afinam a grama.
Com o Blender desktop em vez do wheel: blender -b -P scripts/blender/film.py -- plates.
Armadilhas que custam tempo real
- Comprimento da grama. Definir
normal_factorde um sistema de partículas de cabelo redefinehair_length. Definahair_lengthpor último ou cada fio terá metros de comprimento e o campo parecerá com motion blur. - Parentesco. Parentear move o filho a menos que você defina
matrix_parent_inverse. Partes articuladas pularão do objeto. - Céu. Uma imagem de céu em um cilindro UV estica. Use painéis espelhados em um cilindro grande, ou um plano plano se a câmera nunca panorâmica. Mantenha um sol físico para a luz real.
- Texto sobre o assunto. Verifique cada sobreposição contra o quadro abaixo dela. Mova o texto com
xantes de mover a câmera. - Zoom esconde coisas. Se uma sobreposição nomeia algo ("Bloqueado."), confirme que o crop 2D ainda o contém.
- Desbotamento de cor. Superfícies pintadas sob AgX precisam de cores base mais escuras que o hex da marca. Telas e qualquer coisa que precise ser lida como uma cor exata devem ser emission.
- Sem GPU. Faça orçamento por quadro: cronometre um quadro de layer, multiplique, depois corte resolução, amostras ou duração do plano até caber. Não comece uma renderização que você não cronometrou.
- Reinícios de contêiner. Renderizações longas são interrompidas. A verificação de pular-se-existe é o que te salva.
O que este pipeline não faz
Seja direto com a pessoa sobre isso antes que ela espere.
- Câmeras 3D em movimento. Os planos são travados com movimentos 2D por cima. Parallax real significa renderizar o cenário a cada quadro, o que precisa de uma GPU.
- Motion blur e movimento a 24 fps em layers. Aumente as amostras, defina
STEP = 1e ativerender.use_motion_blurquando o hardware permitir. - Objetos ficam em cima da grama, não dentro dela, porque a grama está na plate.
- Som. O filme é construído para funcionar sem som. Adicione música e efeitos depois, se desejado.
- Telas, UI ou logotipos no mundo 3D. Deliberadamente deixados de fora: UI de produto em um campo fotorrealista parece falso. Coloque visuais do produto no final 2D ou em um corte separado.
Para uma passagem de qualidade final
1920x1080 ou superior para ambas as passagens, 128+ amostras com denoising, renderização em GPU (OptiX ou Metal),
STEP = 1, motion blur ativado, e W, H em comp.py aumentados para corresponder. Divida quadros entre máquinas
por número de quadro; cada quadro é independente.