Vídeo de producto con Blender
Un método y un ejemplo funcional para un vídeo de producto de 45 a 75 segundos que se lee con el sonido apagado. Un set fotorrealista (hierba, una puerta de madera, un cielo real) transmite una metáfora visual. Superposiciones de texto corto dicen lo que las imágenes no pueden. El vídeo termina convirtiéndose en una cuadrícula plana de bloques de colores que giran para formar el titular y la llamada a la acción.
Todo es código: el set, la animación, la composición. No se abre nada en una interfaz gráfica.
Qué hay en esta carpeta
| Ruta | Qué es |
|---|---|
film.json | Paleta, texto de superposición con tiempos, líneas finales. Edita esto primero. |
scripts/blender/build.py | El set: colina con hierba de partículas de cabello, puerta, bloques esmerilados, cielo, niebla, ajustes de renderizado. |
scripts/blender/mascot.py | Personaje de ejemplo: un búho vóxel lo suficientemente pequeño como para sentarse en un poste de la cerca. |
scripts/blender/film.py | Tomas, cámaras, animación fotograma a fotograma. Renderiza plates y layers. |
scripts/post/comp.py | Compositor: placas + capas, movimientos de cámara 2D, texto, gradación, el final de bloques 2D, codificación ffmpeg. |
assets/ | Dos placas de cielo (dorado, nublado). Reemplázalas con las tuyas propias. |
examples/ | Fotogramas de un vídeo realizado con este pipeline. |
El vídeo de ejemplo es "La Puerta": bloques idénticos ruedan a través de una puerta abierta a un ritmo constante, luego llegan en todos los tamaños, y luego enjambran. La puerta se cierra, y después los bloques se dejan pasar, se cuentan o se detienen. Trátalo como referencia para la estructura, luego reemplaza la metáfora por una que se adapte al producto.
Flujo de trabajo
Haz esto en orden. Obtén la aprobación en cada paso numerado antes de invertir tiempo de renderizado en el siguiente.
- Brief. Una frase cada uno: para quién es, el problema, el giro, la promesa, la llamada a la acción. Decide la duración (45 a 75 s), la relación de aspecto y dónde se reproducirá. Asume reproducción silenciada.
- Metáfora. Elige una imagen física para el problema y un cambio en esa imagen para el producto. Un lugar, un accesorio principal, un tipo de objeto en movimiento. Si necesita explicación, elige de nuevo.
- Guión de tomas. 6 a 8 tomas. Para cada una: duración, qué se mueve, la línea de superposición (menos de 8 palabras, una idea), posición de la cámara y lente. El acto del problema con luz fría nublada, el acto del producto con luz cálida. Muéstralo como una tabla y obtén la aprobación.
- Personaje (opcional). Un protagonista pequeño le da a la vista un lugar donde descansar. Ofrece 3 o 4 opciones como bocetos planos antes de modelar nada. Ajústalo al tamaño del set: debe caber en el accesorio principal. Constrúyelo a partir de primitivas simples (el búho son cubos de 1 cm).
- Set en código. Adapta
build.py. Mantén las unidades en metros con el accesorio principal en el origen. Renderiza un fotograma fijo por toma con muestras bajas y mira cada uno antes de animar. - Animación. En
film.py, cada toma tienesetup_X(crea objetos una vez) yupdate_X(t)(coloca todo para el segundo de vídeot). Funciones puras del tiempo, sin fotogramas clave, por lo que cualquier fotograma se puede renderizar solo y un renderizado interrumpido se reanuda donde se detuvo. - Renderizado en dos fases.
python scripts/blender/film.py plates, luego... layers. Ver más abajo. - Composición.
python scripts/post/comp.py out.mp4 --draftpara una comprobación rápida (cada 6º fotograma), luego sin--draft. Usa--only-endingmientras ajustas el final. - Míralo. Extrae fotogramas fijos en el punto medio de cada superposición y verifica: ¿el texto es legible?, ¿la cosa que nombra el texto es visible en el encuadre?, ¿algo salta entre tomas?. Corrige y vuelve a renderizar solo la toma afectada (elimina sus archivos en
layers/).
El renderizado en dos fases
La hierba fotorrealista es lenta. Los objetos en movimiento son baratos. Por lo tanto, se renderizan por separado.
- Placas. Un fotograma fijo por toma del set completo (hierba, accesorio, cielo), 1280x720 con 36 muestras en el ejemplo. Una toma que cambia de luz obtiene dos placas que el compositor funde.
- Capas. Solo lo que se mueve, sobre un fondo transparente, a menor resolución y muestras. El suelo es un capturador de sombras para que los objetos aún proyecten sombras. Los accesorios estáticos son retenedores para que los objetos pasen detrás de ellos correctamente. El cielo se mantiene para la iluminación pero está oculto de la cámara.
- Compositor. Coloca la capa sobre la placa, luego simula el movimiento de la cámara con un desplazamiento o deriva 2D lento por toma. Una cámara 3D fija es lo que hace que la placa sea reutilizable.
Tres cosas mantienen el coste bajo:
- Bucles. Si una toma es un flujo constante, haz que el movimiento sea periódico (espaciado de 0.84 m a 0.84 m/s se repite cada segundo) y renderiza un período.
LOOPenfilm.pyycomp.pylista estas tomas. - A dos fotogramas. Las capas se renderizan cada dos fotogramas (
STEP = 2) y se mantienen. Se lee como stop motion, lo que se adapta a objetos pequeños y bloqueados. - Reanudación. Cada fotograma se omite si su archivo ya existe.
Para escala: el vídeo de ejemplo (51 s de 3D más un final de 12.5 s) tiene 8 placas y 456 fotogramas de capa. Se renderizó solo en CPU.
El final 2D
comp.py lo dibuja directamente, sin Blender. Una cuadrícula de 64x36 cuadrados redondeados de la paleta entra volando sobre el último fotograma 3D con un ancho de 6 columnas, la cámara se aleja hasta que se muestran las 64 columnas, luego una onda diagonal gira cada bloque (un aplastamiento vertical a cero y de vuelta, con el intercambio de color en el punto medio) a su color final. Los colores finales provienen de una fuente de píxeles de 3x5, por lo que los bloques se convierten en el texto.
Límites para planificar el texto: hasta cuatro líneas, 12 caracteres cada una (11 se ve mejor), mayúsculas, dígitos y . - / !. Establécelos en film.json bajo ending con una fila de la cuadrícula y una clave de la paleta.
Editar film.json
palette: siete colores hexadecimales.primary,accent,warm,soft,deep,paper(fondo del final y el bloque predeterminado),alarm(el color de "algo está mal").overlays:[inicio, fin, "texto", x]en segundos de vídeo.xes opcional, una posición horizontal de 0 a 1 para cuando el sujeto se encuentra donde el texto centrado lo cubriría. Usa\npara dos líneas.ending: las líneas que deletrean los bloques.font: ruta a un archivo .ttf o .otf para las superposiciones. Recurre a Inter, DejaVu, Helvetica o Arial.
Las duraciones de las tomas están en SHOTS al principio de film.py y comp.py. Mantenlas iguales.
Configuración
python -m venv venv && . venv/bin/activate
pip install bpy==5.3.0 numpy pillow # bpy es la rueda de Blender; necesita el Python correspondiente
# ffmpeg debe estar en PATH
TEST=1 python scripts/blender/film.py plates # 480x270, un fotograma por toma, unos pocos minutos
TEST=1 python scripts/blender/film.py layers
python scripts/post/comp.py draft.mp4 --draft
FILM_OUT=/algún/directorio escribe plates/ y layers/ allí en lugar de en esta carpeta. FILM_CONFIG
apunta a un film.json diferente. GRASS_NEAR y GRASS_MID (porcentaje) adelgazan la hierba.
Con Blender de escritorio en lugar de la rueda: blender -b -P scripts/blender/film.py -- plates.
Errores que cuestan tiempo real
- Longitud de la hierba. Establecer
normal_factorde un sistema de partículas de cabello restablecehair_length. Establecehair_lengthal final o cada brizna tendrá metros de largo y el campo parecerá con movimiento borroso. - Parentesco. El parentesco mueve al hijo a menos que establezcas
matrix_parent_inverse. Las partes articuladas saltarán del accesorio. - Cielo. Una imagen de cielo en un cilindro UV se estira. Usa paneles reflejados en un cilindro grande, o un plano plano si la cámara nunca panea. Mantén un sol físico para la luz real.
- Texto sobre el sujeto. Verifica cada superposición contra el fotograma debajo de ella. Mueve el texto con
xantes de mover la cámara. - Los zoom-ins ocultan cosas. Si una superposición nombra algo ("Bloqueado."), confirma que el recorte 2D todavía lo contiene.
- Pérdida de color. Las superficies pintadas bajo AgX necesitan colores base más oscuros que el hex de la marca. Las pantallas y cualquier cosa que deba leerse como un color exacto deben ser emisivas.
- Sin GPU. Presupuesta por fotograma: mide el tiempo de un fotograma de capa, multiplica, luego reduce la resolución, las muestras o la duración de la toma hasta que encaje. No inicies un renderizado que no hayas cronometrado.
- Reinicios del contenedor. Los renderizados largos se interrumpen. La verificación de omitir si existe es lo que te salva.
Lo que este pipeline no hace
Sé sincero con la persona sobre esto antes de que lo espere.
- Cámaras 3D en movimiento. Las tomas son fijas con movimientos 2D superpuestos. El paralaje real significa renderizar el set cada fotograma, lo que necesita una GPU.
- Desenfoque de movimiento y movimiento a 24 fps en las capas. Aumenta las muestras, establece
STEP = 1y activarender.use_motion_blurcuando el hardware lo permita. - Los objetos se sientan sobre la hierba, no dentro de ella, porque la hierba está en la placa.
- Sonido. El vídeo está diseñado para funcionar en silencio. Agrega música y efectos después si se desea.
- Pantallas, UI o logotipos en el mundo 3D. Dejado fuera deliberadamente: la UI del producto en un campo fotorrealista se lee como falsa. Pon los elementos visuales del producto en el final 2D o en un corte separado.
Para un pase de calidad final
1920x1080 o superior para ambas fases, 128+ muestras con denoising, renderizado por GPU (OptiX o Metal), STEP = 1, desenfoque de movimiento activado, y W, H en comp.py elevados para que coincidan. Divide los fotogramas entre máquinas por número de fotograma; cada fotograma es independiente.