Tubería de Producción de Videos con Manim
Estándar Creativo
Esto es cine educativo. Cada fotograma enseña. Cada animación revela estructura.
Antes de escribir una sola línea de código, articula el arco narrativo. ¿Qué concepto erróneo corrige esto? ¿Cuál es el "momento ajá"? ¿Qué historia visual lleva al espectador de la confusión a la comprensión? El mensaje del usuario es un punto de partida — interprétalo con ambición pedagógica.
Geometría antes que álgebra. Muestra la forma primero, la ecuación después. La memoria visual codifica más rápido que la memoria simbólica. Cuando el espectador ve el patrón geométrico antes que la fórmula, la ecuación se siente merecida.
La excelencia en el primer renderizado es innegociable. La salida debe ser visualmente clara y estéticamente coherente sin rondas de revisión. Si algo parece desordenado, mal sincronizado o como "diapositivas generadas por IA", está mal.
Capas de opacidad dirigen la atención. Nunca muestres todo a máxima luminosidad. Elementos principales a 1.0, elementos contextuales a 0.4, elementos estructurales (ejes, cuadrículas) a 0.15. El cerebro procesa la prominencia visual en capas.
Espacio para respirar. Cada animación necesita self.wait() después. El espectador necesita tiempo para asimilar lo que acaba de aparecer. Nunca apresures de una animación a la siguiente. Una pausa de 2 segundos después de una revelación clave nunca se desperdicia.
Lenguaje visual cohesivo. Todas las escenas comparten una paleta de colores, un tamaño tipográfico consistente y velocidades de animación coincidentes. Un video técnicamente correcto donde cada escena usa colores aleatorios diferentes es un fracaso estético.
Requisitos Previos
Ejecuta scripts/setup.sh para verificar todas las dependencias. Requiere: Python 3.10+, Manim Community Edition v0.20+ (pip install manim), LaTeX (texlive-full en Linux, mactex en macOS) y ffmpeg. La documentación de referencia se probó con Manim CE v0.20.1.
Modos
| Modo | Entrada | Salida | Referencia |
|---|---|---|---|
| Explicador de conceptos | Tema/concepto | Explicación animada con intuición geométrica | references/scene-planning.md |
| Derivación de ecuaciones | Expresiones matemáticas | Demostración animada paso a paso | references/equations.md |
| Visualización de algoritmos | Descripción del algoritmo | Ejecución paso a paso con estructuras de datos | references/graphs-and-data.md |
| Historia de datos | Datos/métricas | Gráficos animados, comparaciones, contadores | references/graphs-and-data.md |
| Diagrama de arquitectura | Descripción del sistema | Componentes que se construyen con conexiones | references/mobjects.md |
| Explicador de artículos | Artículo de investigación | Hallazgos clave y métodos animados | references/scene-planning.md |
| Visualización 3D | Concepto 3D | Superficies rotativas, curvas paramétricas, geometría espacial | references/camera-and-3d.md |
Stack
Un único script de Python por proyecto. Sin navegador, sin Node.js, sin GPU requerida.
| Capa | Herramienta | Propósito |
|---|---|---|
| Núcleo | Manim Community Edition | Renderizado de escenas, motor de animación |
| Matemáticas | LaTeX (texlive/MiKTeX) | Renderizado de ecuaciones vía MathTex |
| Video I/O | ffmpeg | Unión de escenas, conversión de formatos, multiplexación de audio |
| TTS | ElevenLabs / Qwen3-TTS (opcional) | Locución de narración |
Tubería
PLANIFICAR --> CODIFICAR --> RENDERIZAR --> UNIR --> AUDIO (opcional) --> REVISAR
- PLANIFICAR — Escribe
plan.mdcon el arco narrativo, lista de escenas, elementos visuales, paleta de colores, guión de locución - CODIFICAR — Escribe
script.pycon una clase por escena, cada una renderizable de forma independiente - RENDERIZAR —
manim -ql script.py Escena1 Escena2 ...para borrador,-qhpara producción - UNIR — Concat de ffmpeg de los clips de escena en
final.mp4 - AUDIO (opcional) — Agrega locución y/o música de fondo vía ffmpeg. Consulta
references/rendering.md - REVISAR — Renderiza vistas previas estáticas, verifica contra el plan, ajusta
Estructura del Proyecto
nombre-proyecto/
plan.md # Arco narrativo, desglose de escenas
script.py # Todas las escenas en un archivo
concat.txt # Lista de escenas de ffmpeg
final.mp4 # Salida unida
media/ # Generado automáticamente por Manim
videos/script/480p15/
Dirección Creativa
Paletas de Colores
| Paleta | Fondo | Principal | Secundario | Acento | Caso de uso |
|---|---|---|---|---|---|
| Clásica 3B1B | #1C1C1C | #58C4DD (AZUL) | #83C167 (VERDE) | #FFFF00 (AMARILLO) | Matemáticas/CS general |
| Académica cálida | #2D2B55 | #FF6B6B | #FFD93D | #6BCB77 | Accesible |
| Tecnológica neón | #0A0A0A | #00F5FF | #FF00FF | #39FF14 | Sistemas, arquitectura |
| Monocromática | #1A1A2E | #EAEAEA | #888888 | #FFFFFF | Minimalista |
Velocidad de Animación
| Contexto | run_time | self.wait() después |
|---|---|---|
| Aparición de título/intro | 1.5s | 1.0s |
| Revelación de ecuación clave | 2.0s | 2.0s |
| Transformación/morfismo | 1.5s | 1.5s |
| Etiqueta de apoyo | 0.8s | 0.5s |
| Limpieza con FadeOut | 0.5s | 0.3s |
| Revelación "momento ajá" | 2.5s | 3.0s |
Escala Tipográfica
| Rol | Tamaño de fuente | Uso |
|---|---|---|
| Título | 48 | Títulos de escena, texto de apertura |
| Encabezado | 36 | Encabezados de sección dentro de una escena |
| Cuerpo | 30 | Texto explicativo |
| Etiqueta | 24 | Anotaciones, etiquetas de ejes |
| Subtítulo | 20 | Subtítulos, letra pequeña |
Fuentes
Usa fuentes monoespaciadas para todo el texto. El renderizador Pango de Manim produce kerning roto con fuentes proporcionales en todos los tamaños. Consulta references/visual-design.md para recomendaciones completas.
MONO = "Menlo" # definir una vez al inicio del archivo
Text("Series de Fourier", font_size=48, font=MONO, weight=BOLD) # títulos
Text("n=1: sin(x)", font_size=20, font=MONO) # etiquetas
MathTex(r"\nabla L") # matemáticas (usa LaTeX)
Mínimo font_size=18 para legibilidad.
Variación por Escena
Nunca uses configuración idéntica para todas las escenas. Para cada escena:
- Diferente color dominante de la paleta
- Diferente diseño — no centres todo siempre
- Diferente entrada de animación — varía entre Write, FadeIn, GrowFromCenter, Create
- Diferente peso visual — algunas escenas densas, otras dispersas
Flujo de Trabajo
Paso 1: Planificar (plan.md)
Antes de cualquier código, escribe plan.md. Consulta references/scene-planning.md para la plantilla completa.
Paso 2: Codificar (script.py)
Una clase por escena. Cada escena es renderizable de forma independiente.
from manim import *
BG = "#1C1C1C"
PRINCIPAL = "#58C4DD"
SECUNDARIO = "#83C167"
ACENTO = "#FFFF00"
MONO = "Menlo"
class Escena1_Introduccion(Scene):
def construct(self):
self.camera.background_color = BG
titulo = Text("¿Por qué funciona esto?", font_size=48, color=PRINCIPAL, weight=BOLD, font=MONO)
self.add_subcaption("¿Por qué funciona esto?", duration=2)
self.play(Write(titulo), run_time=1.5)
self.wait(1.0)
self.play(FadeOut(titulo), run_time=0.5)
Patrones clave:
- Subtítulos en cada animación:
self.add_subcaption("texto", duration=N)osubcaption="texto"enself.play() - Constantes de color compartidas al inicio del archivo para consistencia entre escenas
self.camera.background_colorestablecido en cada escena- Salidas limpias — FadeOut de todos los mobjects al final de la escena:
self.play(FadeOut(Group(*self.mobjects)))
Paso 3: Renderizar
manim -ql script.py Escena1_Introduccion Escena2_ConceptoCentral # borrador
manim -qh script.py Escena1_Introduccion Escena2_ConceptoCentral # producción
Paso 4: Unir
cat > concat.txt << 'EOF'
file 'media/videos/script/480p15/Escena1_Introduccion.mp4'
file 'media/videos/script/480p15/Escena2_ConceptoCentral.mp4'
EOF
ffmpeg -y -f concat -safe 0 -i concat.txt -c copy final.mp4
Paso 5: Revisar
manim -ql --format=png -s script.py Escena2_ConceptoCentral # vista previa estática
Notas Críticas de Implementación
Cadenas Raw para LaTeX
# INCORRECTO: MathTex("\frac{1}{2}")
# CORRECTO:
MathTex(r"\frac{1}{2}")
buff >= 0.5 para Texto en Bordes
label.to_edge(DOWN, buff=0.5) # nunca < 0.5
FadeOut Antes de Reemplazar Texto
self.play(ReplacementTransform(nota1, nota2)) # no Write(nota2) encima
Nunca Animes Mobjects No Añadidos
self.play(Create(circulo)) # primero debe añadirse
self.play(circulo.animate.set_color(RED)) # luego animar
Objetivos de Rendimiento
| Calidad | Resolución | FPS | Velocidad |
|---|---|---|---|
-ql (borrador) | 854x480 | 15 | 5-15s/escena |
-qm (media) | 1280x720 | 30 | 15-60s/escena |
-qh (producción) | 1920x1080 | 60 | 30-120s/escena |
Itera siempre en -ql. Renderiza solo en -qh para la salida final.
Referencias
| Archivo | Contenido |
|---|---|
references/animations.md | Animaciones principales, funciones de velocidad, composición, sintaxis .animate, patrones de sincronización |
references/mobjects.md | Texto, formas, VGroup/Group, posicionamiento, estilizado, mobjects personalizados |
references/visual-design.md | 12 principios de diseño, capas de opacidad, plantillas de diseño, paletas de colores |
references/equations.md | LaTeX en Manim, TransformMatchingTex, patrones de derivación |
references/graphs-and-data.md | Ejes, trazado, BarChart, datos animados, visualización de algoritmos |
references/camera-and-3d.md | MovingCameraScene, ThreeDScene, superficies 3D, control de cámara |
references/scene-planning.md | Arcos narrativos, plantillas de diseño, transiciones de escenas, plantilla de planificación |
references/rendering.md | Referencia de CLI, preajustes de calidad, ffmpeg, flujo de trabajo de locución, exportación a GIF |
references/troubleshooting.md | Errores de LaTeX, errores de animación, errores comunes, depuración |
references/animation-design-thinking.md | Cuándo animar vs. mostrar estático, descomposición, ritmo, sincronización de narración |
references/updaters-and-trackers.md | ValueTracker, add_updater, always_redraw, updaters basados en tiempo, patrones |
references/paper-explainer.md | Convertir artículos de investigación en animaciones — flujo de trabajo, plantillas, patrones de dominio |
references/decorations.md | SurroundingRectangle, Brace, flechas, DashedLine, Angle, ciclo de vida de anotaciones |
references/production-quality.md | Listas de verificación previas al código, previas al renderizado y posteriores al renderizado, diseño espacial, color, tempo |
Divergencia Creativa (usar solo cuando el usuario solicite una salida experimental/creativa/única)
Si el usuario pide enfoques explicativos creativos, experimentales o no convencionales, selecciona una estrategia y raciocínala ANTES de diseñar la animación.
- SCAMPER — cuando el usuario quiera una perspectiva fresca sobre una explicación estándar
- Inversión de Supuestos — cuando el usuario quiera desafiar cómo se enseña algo típicamente
Transformación SCAMPER
Toma una visualización matemática/técnica estándar y transfórmala:
- Sustituir: reemplaza la metáfora visual estándar (recta numérica → camino sinuoso, matriz → cuadrícula de ciudad)
- Combinar: fusiona dos enfoques de explicación (algebraico + geométrico simultáneamente)
- Invertir: deriva hacia atrás — empieza desde el resultado y deconstruye hasta los axiomas
- Modificar: exagera un parámetro para mostrar por qué importa (10x la tasa de aprendizaje, 1000x el tamaño de la muestra)
- Eliminar: elimina toda notación — explica puramente a través de animación y relaciones espaciales
Inversión de Supuestos
- Enumera lo que es "estándar" sobre cómo se visualiza este tema (de izquierda a derecha, 2D, pasos discretos, notación formal)
- Elige el supuesto más fundamental
- Inviértelo (derivación de derecha a izquierda, incrustación 3D de un concepto 2D, morfismo continuo en lugar de pasos, cero notación)
- Explora lo que la inversión revela que el enfoque estándar oculta