Cómo se hacen las animaciones de 3Blue1Brown [video]
(youtube.com)- Las visualizaciones de 3Blue1Brown se codifican con Manim, una biblioteca de Python creada por Grant Sanderson, y el video sigue el flujo real de producción junto con Ben Sparks
- Manim se dividió en el entorno personal de producción de Grant y Manim Community, que refuerza documentación, pruebas y atención a issues; para principiantes, normalmente conviene la versión comunitaria
- El trabajo se parece a conectar Sublime Text con una terminal de Python para ejecutar fragmentos de código al instante y usar checkpoint paste para cachear estados intermedios y experimentar de forma iterativa
- La demo calcula el atractor de Lorenz con SciPy y luego combina curvas, puntos, updaters, cámara 3D y efecto de estela para mostrar cómo se separan condiciones iniciales cercanas
- La escena final se revisa con una ejecución previa para confirmar errores y duración, luego se renderiza como MP4 y después pasa a una herramienta de edición para continuar el proceso de creación del video de YouTube
El punto de partida de Manim y sus dos versiones
- La herramienta central de las animaciones de 3Blue1Brown es Manim, una biblioteca de Python creada por el propio Grant Sanderson
- Manim construye todas las escenas de forma programática y ha evolucionado como una herramienta a medida para el estilo de producción de 3Blue1Brown
- Hacia el final de sus estudios de grado, Grant escribió código en Python para visualizar mejor funciones matemáticas como transformaciones, y ese código nació junto con los primeros videos del canal
- A medida que aumentó la cantidad de videos, la herramienta fue mejorando, y esas mejoras a su vez hicieron posibles videos más complejos
- Los efectos visuales del video reciente sobre hologramas habrían sido mucho más difíciles hace 2 o 3 años, pero gracias a varios años de mejoras en el workflow, la dificultad de producción bajó
Manim Community y la versión personal de Grant
- Grant ha ido publicando en GitHub tanto el código usado en sus videos como Manim en sí
- Sin embargo, al combinar producción de videos con mantenimiento open source, la atención a issues y Pull Requests no fue suficiente
- La comunidad hizo un fork del repositorio para crear una herramienta más robusta, y esa versión es Manim Community
- Tiene una atención más activa a issues y Pull Requests
- Cuenta con mejores pruebas y documentación
- En general, es la versión recomendada para quienes recién empiezan
- En la demo del video se usa la versión que Grant utiliza directamente
- En los últimos años se ha vuelto más interactiva y rápida
- Para usuarios que valoran documentación y pruebas, la versión comunitaria es más adecuada
Forma de producción: escribir código y verlo de inmediato
- Cada escena de Manim se escribe como una class de Python, y el código a renderizar va dentro del método
construct - Se agregan objetos como círculos, rectángulos o texto a la pantalla, y con el método
playse ejecutan animaciones comoWriteoTransform - La mayoría de los objetos se colocan por defecto en el centro de la pantalla, y su posición se cambia con operaciones como
to_edgeoshift - El entorno de trabajo de Grant combina Sublime Text con una terminal de Python
- Al copiar líneas de código y ejecutarlas en la terminal, se reflejan de inmediato en la escena actual
- Un atajo de Sublime automatiza el proceso de copiar y ejecutar el código seleccionado
- La terminal está conectada con la escena actual, por lo que permite ver al instante el resultado de las modificaciones
- En escenas largas, es importante poder experimentar solo con secciones intermedias sin volver a ejecutar todo el código cada vez
- El ejemplo del video de hologramas era un código Python largo que generaba un MP4 de 4 minutos y 30 segundos
- Para escenas largas, mantener todo en un solo archivo resultaba útil porque compartían mucho contexto y variables locales
checkpoint pastecachea el estado de la escena en una ubicación específica marcada por un comentario, vuelve a ese estado y luego ejecuta el código seleccionado- Este enfoque se parece a un workflow híbrido entre un archivo de texto puro y un Jupyter notebook
La intuición básica de una animación en Manim
- Una de las filosofías importantes de Manim es que “cualquier cosa puede transformarse en cualquier otra”
- Por ejemplo, se puede crear una escena en la que la primera letra
Hdel textohello worldse transforma en un círculo- No hace falta agregar el círculo directamente a la escena; se puede definir como destino de la transformación
- El texto es un grupo de caracteres, por lo que se pueden extraer y manipular caracteres individuales
Transformusa por defecto una rate function suave- El valor predeterminado es
smooth, que se ve como un movimiento suave basado en cubic bezier - Con
linear, el inicio y el final se sienten más rígidos - Cuando se necesita mostrar tal cual el avance matemático del tiempo, hace falta usar
linear
- El valor predeterminado es
- Estos ajustes finos marcan la diferencia entre una “escena que se mueve” y una “escena que se ve bien”
- Animaciones familiares de los videos de 3Blue1Brown, como
Write, también pueden invocarse como funciones integradas de Manim
Demo del atractor de Lorenz
- El ejemplo central de la demo es el atractor de Lorenz
- Es una forma que surge de ecuaciones diferenciales tridimensionales
- Define con reglas deterministas cómo cambia un punto en el espacio 3D a medida que pasa el tiempo
- Al variar varias condiciones iniciales, se obtienen resultados visuales interesantes
- Grant le pidió a ChatGPT que escribiera una función en Python para la parte de cálculo matemático
- Se usaron
integratede SciPy y una función para resolver problemas de valores iniciales - El código generado estaba pensado para renderizar con Matplotlib, y luego se ajustó para Manim
- Se usaron
- El estado de las ecuaciones de Lorenz tiene coordenadas
x,y,z, y se expresa como una función que calcula las derivadas en cada instante - El resultado numérico viene como valores de tiempo y valores
x,y,z, y Grant usa un wrapper para manejarlo con más comodidad- La representación de SciPy puede ser algo confusa porque trata
ycomo salida - Ajusta el arreglo de estados y su forma transpuesta de la manera que le resulta más cómoda
- La representación de SciPy puede ser algo confusa porque trata
- Al poner la condición inicial en
(0, 0, 0), todos los valores daban 0 y no resultaba adecuado; al cambiar una coordenada a 10, se generaron puntos interesantes - En Manim, para convertir los puntos calculados en una curva se usa
set_points_as_corners - Para convertir el sistema de coordenadas de los ejes al sistema de coordenadas de Manim se usa
c2p, abreviatura decoords_to_point - La sintaxis
*de Python se usa para desempaquetar un iterable y pasarlo como argumentos de una función- En el ejemplo, se separan las listas de coordenadas
x,y,zy se pasan a la función
- En el ejemplo, se separan las listas de coordenadas
Escena donde condiciones iniciales cercanas se separan
- La clave de la visualización del atractor de Lorenz es mostrar cómo condiciones iniciales muy cercanas se mueven de forma similar al principio, pero luego se separan
- Grant crea una lista de condiciones iniciales y configura la coordenada
zpara que difiera por un pequeñoepsilon- Al principio empieza con 2 condiciones
- Luego aumenta a 10 condiciones
- Para contener varias curvas usa
VGroup- Indicar que se trata de un grupo de objetos vectorizados puede acelerar el renderizado
- En el extremo de cada curva coloca un glow dot
GlowDotes un objeto creado para mostrar de forma visualmente agradable un punto en movimiento- Cada punto lleva un updater que lo mueve en cada frame hasta el extremo de la curva
zipse usa para recorrer en paralelo listas correspondientes, como puntos y curvas, o estados y colores- Si las dos listas tienen longitudes distintas, se detiene cuando termina la más corta
- Con
color_gradientse crea la misma cantidad de colores que de estados para hacer coincidir las longitudes
- Al dibujar curvas con
ShowCreation, usar el smoothing predeterminado puede distorsionar el avance real del tiempo, por lo que en las partes que muestran la dinámica tal cual se utiliza una linear rate function - Las condiciones iniciales cercanas al principio se mueven casi juntas, pero con el tiempo se dispersan como si estuvieran en posiciones completamente distintas
- El atractor de Lorenz se trata como un strange attractor: no es un simple punto ni un ciclo, sino que es atraído hacia una forma específica, aunque la posición exacta es sensible a las condiciones iniciales
Código alternativo del modo interactivo y efectos de escena
- Durante la demo aparece código “maldito” como
globals().update(locals()) - Ese código es una solución temporal para evitar un problema del entorno IPython embed de Manim, donde una función no puede ver variables del scope externo
- En un script normal de Python, el mismo código funciona correctamente
- En el entorno interactivo embebido de Manim puede producirse un
NameError - El problema se esquiva colocando las variables locales en el diccionario de variables globales
- En código real de una biblioteca, este enfoque sería inapropiado, pero en una sesión interactiva temporal para desarrollar escenas el riesgo es relativamente menor
- Una mejor forma sería hacer que la función reciba explícitamente como argumentos las variables que necesita
- Para hacer que una curva desaparezca con el tiempo, se puede usar
FadeOut- Si el
run_timedeplayse hace coincidir con el evolution time, la curva se vuelve transparente gradualmente durante ese tiempo
- Si el
- El efecto de dejar una estela detrás del punto se implementa con
TracingTail- Se puede crear una cola que sigue a un punto
- Si
time_tracedaumenta de 1 segundo a 3 segundos, se ve una cola de mayor duración - Si se agrega una cola a cada uno de los 10 puntos, se ve con más claridad cómo se dispersan las múltiples trayectorias
Cámara 3D y manejo de fórmulas
- Las escenas de Manim pueden tener coordenadas 3D por defecto, pero la mayoría de las escenas de 3Blue1Brown se configuran para verse como un pizarrón 2D por razones educativas
- Como el atractor de Lorenz requiere 3D, se agregan ejes 3D
- En una pantalla 3D, para mantener la sensación de profundidad resulta útil que la cámara rote o se mueva lentamente
- Grant usa un atajo que guarda en el portapapeles la posición actual de la cámara
- Con una forma como
frame.animate.reorient(...), anima el frame de la cámara hacia una posición específica
- Las fórmulas se pueden agregar a la escena como objetos LaTeX
- Con MathPix se puede leer una ecuación en pantalla mediante OCR y obtener LaTeX o SVG
- Para fijar una fórmula en la pantalla dentro de una escena 3D, se usa
fix_in_frame
- Se pueden colorear variables específicas de una fórmula LaTeX
- En el ejemplo,
x,y,zse asignan a colores distintos - La capacidad de separar el texto en componentes matemáticos para resaltarlos o transformarlos es útil para explicaciones matemáticas
- En el ejemplo,
- Manim también tiene transforms especiales que hacen coincidir strings
- Términos como
A^2yB^2se mueven de forma natural hacia la posición de la misma cadena en la línea siguiente - El matching basado en strings también permite efectos como animaciones de anagramas, enviando letras a sus posiciones correspondientes
- Términos como
- Con animaciones como
flash aroundeindicatese pueden resaltar caracteres o términos específicos de una fórmula
Renderizado y flujo real de producción
- Cuando una escena queda bien, se renderiza con un comando de Manim especificando el archivo Python y el nombre de la escena
pre-runes una etapa para revisar toda la animación antes de usarla de verdad- Permite estimar la duración total
- Ayuda a detectar errores antes, no durante un renderizado intermedio
Wes una opción para escribir a archivo, y las opciones relacionadas con Finder sirven para abrir el archivo resultante en el Finder de macOS- El resultado final se renderiza como un archivo MP4
- Grant normalmente renderiza en 4K, por lo que puede tardar más
- Luego, el archivo renderizado se incorpora a una herramienta de edición
- La forma anterior de usar Manim consistía principalmente en repetir el ciclo de renderizar escenas desde la línea de comandos y revisar el MP4
- Más adelante, en una época similar al cambio hacia la implementación en OpenGL, surgió un flujo de trabajo basado en una shell interactiva, y el proceso pasó a ser resaltar código y ver el resultado de inmediato
- El workflow concreto de Grant depende de scripts de Sublime Text y de la extensión Terminus
- En otros editores de texto se puede imitar un comportamiento similar
- También se puede construir un flujo del mismo estilo en entornos de la familia Visual Studio
- Para buscar funciones se pueden usar escenas de ejemplo, la carpeta
animationde la biblioteca y el repositorio de GitHub3b1b/videos, que contiene código de videos anteriores - Grant prefiere un autocompletado más simple que Copilot
- En Manim, a menudo ya sabe qué comportamiento quiere
- Le resulta más natural expresar la petición en código que en inglés
1 comentarios
Opiniones en Hacker News
3B1B está haciendo un trabajo realmente increíble.
Personalmente, sus videos de YouTube me han ayudado muchísimo, y ojalá en la secundaria o en ingeniería nos hubieran enseñado matemáticas de esta forma.
También vale la pena ver https://sinerider.com/
Es un juego creado por alguien que a veces ayuda a Grant Sanderson con su trabajo en 3B1B; un excelente juego educativo de matemáticas donde creas pistas como en LineRider, pero con ecuaciones.
Tanto 3B1B como SineRider fueron lo que más influyó en mi comprensión intuitiva de la composición de funciones.
Me impresionó la escena en la que descubre en tiempo real un bug del motor de renderizado y hasta encuentra una solución alternativa.
https://youtu.be/rbu7Zu5X1zI?feature=shared&t=693
Aun así, es un trabajo impresionante.
Que sepa dónde está y cuál es la causa, y que se le ocurra una solución alternativa en vivo, significa que invierte tiempo en mejorar sus propias herramientas, y no solo de vez en cuando, sino activamente.
A mí me sigue pareciendo genial.
Me dio curiosidad cómo funcionaba el REPL interactivo de Python que aparecía abajo a la derecha.
Edición: parece ser un flujo de trabajo completamente personalizado: https://github.com/3b1b/videos?tab=readme-ov-file#workflow
Después de haber escuchado solo su voz durante años sin verle la cara, verlo de pronto se siente como entrar de lleno en el valle inquietante, y eso me da risa.
En varios videos recientes actúa como presentador, entrevistador y narrador.
También se siente raro cuando un creador se encarga de algunos videos en lugar de otro, como en veratasium.
Si hablamos de una revelación de verdad grande, sería AvE.
En ese entonces, muchos comentarios de sus videos eran sobre el nombre y el ícono del canal, y de hecho uno de sus ojos se ve así.
Aun así, parece que incluso dentro de estos canales de nicho los gustos varían bastante.
Su voz es realmente buena. Es tranquila y cómoda; puedo ponerlo de fondo mientras hago tareas de la casa y aun así aprender algo.
Creadores así merecen reconocimiento.
Su video más reciente sobre hologramas está entre los videos de YouTube de mayor calidad que he visto.
Sería genial hacer con esta herramienta un video explicativo sobre el algoritmo de bridging[1].
Desde 2016 soy fan de cómo se usa este algoritmo en procesos de democracia participativa con herramientas como Pol.is, y quería contribuir a mejorar la comprensión de las matemáticas que lo sustentan.
Si hubiera conocido Manim cuando se hizo Summer of Math Exposition[2], seguro me habría sumado.
[1]: https://bridging.systems/
[2]: https://some.3b1b.co/
Mi sitio web está en mi perfil, así que si algún día lo haces, me gustaría que me mandaras el enlace por redes sociales.
Enlace a Manim: https://github.com/3b1b/manim
Me sorprende la enorme cantidad de producción que hay detrás de cada uno de sus videos. Se merece recibir el botón de reproducción de YouTube.
Como con los blogs, si no tienes suerte, gran parte de ese esfuerzo se desperdicia. Pero un blog al menos tiene varias oportunidades de obtener exposición. Puede llegar a la portada de HN, difundirse en X o en otros lugares. Incluso dentro de una misma plataforma normalmente hay varias oportunidades.
En cambio, en YouTube el algoritmo básicamente decide una sola vez. Si no tienes ya una cantidad enorme de suscriptores, le muestra el video a unas pocas personas casi al azar y, si no reaccionan, ahí termina todo.