Animación con Manim — Video Matemático y Técnico
Manim es un motor de animación Python para crear visuales explicativos. Su fortaleza es la exactitud: una fórmula, gráfico o construcción se anima como un objeto matemáticamente definido, no como una aproximación en una herramienta de diseño.
Lee references/MANIM-PLAYBOOK.md para patrones y código. Verifica las banderas contra la versión instalada: https://docs.manim.community/en/stable/
1. Cuándo elegir Manim
Elige Manim cuando:
- Ecuaciones, símbolos o demostraciones son el tema central.
- Los sistemas de coordenadas, gráficos, vectores o construcciones geométricas deben ser exactos.
- Un algoritmo, estructura de datos o proceso necesita una explicación visual paso a paso.
- Las etiquetas deben alinearse a un objeto matemático, no a una posición de marco colocada a mano.
- El estilo debe ser sobrio y diagramático, no cinematográfico.
No elijas Manim para: 3D cinematográfico, video promocional con muchas marcas, tipografía de gráficos en movimiento o entregables interactivos. Eso pertenece a Blender, Remotion o gráficos web.
2. Instalación (aislada, reproducible)
uv --version # instala uv primero si falta
uv init --python 3.12 manim-project
cd manim-project
uv add manim
uv run manim --version
Linux a menudo necesita bibliotecas nativas:
sudo apt update
sudo apt install build-essential python3-dev pkg-config libcairo2-dev libpango1.0-dev ffmpeg
sudo apt install texlive texlive-latex-extra texlive-fonts-recommended # para MathTex/Tex
macOS: brew install cairo pango pkg-config ffmpeg y una distribución TeX como MacTeX si se usa MathTex.
Windows: instala FFmpeg y MiKTeX/TeX Live; es posible que se necesiten Microsoft C++ Build Tools para las ruedas de Cairo/Pango.
Verifica:
uv run manim --version
uv run python -c "import manim; print(manim.__version__)"
No instales Manim en el Python del sistema si hay un entorno de proyecto disponible. Registra la versión en el README del proyecto.
3. Comandos de renderizado
# vista previa de baja calidad (rápida)
uv run manim -pql scenes/explain.py ExplainScene
# media
uv run manim -qm scenes/explain.py ExplainScene
# alta / producción
uv run manim -qh scenes/explain.py ExplainScene
# 4K
uv run manim -qk scenes/explain.py ExplainScene
# fondo transparente
uv run manim -qh -t scenes/explain.py ExplainScene
# sección específica
uv run manim -qh scenes/explain.py ExplainScene -n 12,20
Preajustes de calidad: -ql 480p15, -qm 720p30, -qh 1080p60, -qk 2160p60. Confirma en la versión instalada. La salida va a media/videos/<archivo>/<calidad>/.
ffprobe -v error -show_entries stream=width,height,r_frame_rate,duration \
-of json media/videos/explain/1080p60/ExplainScene.mp4
4. Reglas de diseño de escenas
- Una idea por escena. Divide en subclases de
Scene; compón un video más largo mediante concatenación, no una escena gigante. - Establece la paleta y las fuentes una vez en un módulo (
theme.py) e impórtalos, en lugar de repetir valores hexadecimales. - Refrena la cámara. El
MovingCameraScenede Manim es poderoso y fácil de abusar; haz zoom solo para revelar una estructura que el espectador no podría ver de otra manera. - Respeta la duración. Una derivación de fórmula que se lee bien en 3 minutos se sentirá apresurada en 40 segundos. Calcula el tiempo de permanencia a partir de la velocidad de lectura, no de la intuición.
- Mantén las etiquetas adjuntas al objeto que describen (
Tex+next_to), para que un cambio posterior en el diseño no rompa silenciosamente la alineación. - Usa
Transform/ReplacementTransformpara el significado,FadeIn/FadeOutpara la presencia. Transformar formas no relacionadas confunde a los espectadores. - No animes cada elemento de forma independiente. Agrúpalos con
VGroupy escalónalos intencionadamente.
5. Receta de composición
from manim import *
class ExplainScene(Scene):
def construct(self):
title = Text("Por qué la derivada es un límite", font="Inter").scale(0.7)
self.play(Write(title), run_time=1.2)
self.wait(0.6)
self.play(title.animate.to_edge(UP).scale(0.8), run_time=0.9)
formula = MathTex(r"f'(x) = \lim_{h \to 0} \frac{f(x+h)-f(x)}{h}")
formula.scale(1.2)
self.play(Write(formula), run_time=1.6)
self.wait(1.2)
self.play(formula.animate.set_color_by_tex(r"h \to 0", YELLOW), run_time=0.8)
self.wait(1.5)
6. Exportación y entrega
-qhproduce 1080p60 a alta tasa de bits; vuelve a codificar para la entrega en lugar de enviar el intermedio.- Transparencia:
-tescribe un.movcon alfa (o una secuencia PNG con--format=png). Verifica el alfa sobre un patrón de damero antes de componer. - Para combinar Manim con Remotion/Blender: iguala FPS y resolución, luego ensambla en FFmpeg o Remotion. Manim por defecto usa 60 FPS en
-qh; cambiaconfig.frame_rateo convierte deliberadamente. - Para intros/outros con marca y subtítulos, renderiza las escenas de Manim limpias y compónlas en Remotion — no luches contra el sistema de tipografía de Manim para el diseño de marca.
7. Validación
- Mira el renderizado de baja calidad antes que el de alta calidad; los errores matemáticos son visibles a 480p.
- Comprueba que ninguna fórmula esté recortada en el borde del cuadro y que ninguna etiqueta se superponga a otra.
- Verifica que LaTeX se haya compilado sin fallos silenciosos (busca advertencias de texto rojo en la consola).
- Confirma la duración final y la tasa de fotogramas con
ffprobe. - Lee cada símbolo en voz alta contra la matemática prevista; un signo invertido es un error de corrección, no una elección de estilo.
8. Fallos comunes
| Síntoma | Causa | Solución |
|---|---|---|
latex: command not found | Sin distribución TeX | Instala TeX Live/MiKTeX, o usa Text en lugar de MathTex |
| Error de compilación Cairo/Pango | Faltan bibliotecas nativas | Instala los paquetes de desarrollo listados arriba |
| La fórmula se renderiza como texto de error rojo | Sintaxis LaTeX o paquete faltante | Revisa la consola; agrega paquetes a TexTemplate |
| Todo se ve borroso | Preajuste de baja calidad | Renderiza con -qh/-qk para la versión final |
| Texto griego/árabe roto | La fuente carece de glifos o shaping | Usa una fuente con capacidad de shaping, prueba un fotograma fijo, o rasteriza el texto |
| Renderizado muy lento | 60 FPS + 4K + trazados complejos | Previsualiza con -ql, simplifica trazados, divide escenas |
| Transparencia perdida | Formato incorrecto | Usa -t y un contenedor compatible con alfa; verifica |
9. Referencias oficiales
- Documentación: https://docs.manim.community/en/stable/
- Instalación: https://docs.manim.community/en/stable/installation.html
- Tutoriales: https://docs.manim.community/en/stable/tutorials.html
- Galería de ejemplos: https://docs.manim.community/en/stable/examples.html
- Código fuente: https://github.com/ManimCommunity/manim