Ir al contenido

Primera Animación

— Rayuela

Andábamos sin buscarnos pero sabiendo que andábamos para encontrarnos.

— Julio Cortázar

Ahora que ya tenemos Manim instalado y funcionando, es hora de ponerlo en marcha.

Abrimos nuestro editor de texto favorito e introducimos el siguiente código:

first_animation.py
from manim import *
class MyFirstAnimation(Scene):
def construct(self):
square = Square()
self.play(
Write(square)
)

Seguidamente, vamos a nuestra terminal:

Ventana de terminal
uv run manim first_animation.py -p

Esto va a generar el siguiente video:

Vamos a estudiar en orden qué hemos hecho y que ha pasado.

A python le hemos dicho:

  1. De la librería Manim, tráete todo todito lo que tengas.

    first_animation.py
    from manim import *
    class MyFirstAnimation(Scene):
    def construct(self):
    square = Square()
    self.play(
    Write(square)
    )
  2. Crea una clase llamada MyFirstAnimation que herede de Scene

    first_animation.py
    from manim import *
    class MyFirstAnimation(Scene):
    def construct(self):
    square = Square()
    self.play(
    Write(square)
    )
  3. Sobreescribe el método construct para que instancie un Square y le aplique la animación Write

    first_animation.py
    from manim import *
    class MyFirstAnimation(Scene):
    def construct(self):
    square = Square()
    self.play(
    Write(square)
    )

En la terminal hemos dicho:

  1. ¡Eh, tú, uv, llama a Manim!

    Ventana de terminal
    uv run manim first_animation.py -p
  2. Ahora, Manim, renderiza lo que sea que haya en el archivo first_animation.py.

    Ventana de terminal
    uv run manim first_animation.py -p
  3. ¡Y quiero previsualizar!

    Ventana de terminal
    uv run manim first_animation.py -p

El resultado es el video tan chulo que hemos visto más arriba junto con otra serie de archivos:

  • Directoriomanim-workshop
    • first_animation.py
    • Directoriomedia
      • Directoriovideos
        • Directoriofirst_animation
          • Directorio1080p60
            • Directoriopartial_movie_files
              • DirectorioMyFirstAnimation
                • <hash>.mp4
                • partial_movie_file_list.txt
            • MyFirstAnimation.mp4

Manim ha generado una carpeta media dentro de la que hay otra llamada videos. Allí ha creado una carpeta usando el nombre de nuestro archivo python: first_animation.

Dentro de esa, otra carpeta con la calidad del video, en este caso 1080p60 dentro de la cual tenemos un video con el nombre de la clase que hemos creado y otra carpeta con fragmentos de la animación.

Conforme avancemos el taller iremos llenando esta carpeta con más cosas. Por lo general Manim genera archivos bastante comprimidos, pero os recomiendo ir haciendo limpieza de vez en cuando.

Vamos ahora a crear otro archivo llamado second_animations.py. Dentro de él vamos a hacer modificaciones a nuestra animación inicial.

Primero de todo, vamos a copiar el contenido de first_animation.py pero modificando el nombre de la clase a SecondAnimation. Luego, vamos a darle un poco de color a este cuadrado tan soso.

second_animations.py
from manim import *
class MyFirstAnimation(Scene):
class MySecondAnimation(Scene):
def construct(self):
square = Square()
square = Square(fill_color=GREEN, fill_opacity=1)
self.play(
Write(square)
)

Y, de nuevo, vamos a renderizar nuestra animación:

Ventana de terminal
uv run manim second_animations.py -p

Vamos con otro cambio, venga, nuestra tercera animación. Agregamos esto al código para hacer una animación en la que el cuadrado gire en lugar de dibujarse.

second_animations.py
class MyThirdAnimation(Scene):
def construct(self):
square = Square(fill_color=GREEN, fill_opacity=1)
self.play(
Write(square)
)
self.play(
Rotate(square)
)

Si volvemos a llamar a Manim desde la terminal veremos algo nuevo:

Ventana de terminal
$ uv run manim second_animations.py -p
Manim Community v0.21.0
1: MySecondAnimation
2: MyThirdAnimation
Choose number corresponding to desired scene/arguments.
(Use comma separated list for multiple entries or use "*" to select all scenes.)
Choice(s):
$ 2

Aquí Manim ha detectado que tenemos dos clases que heredan de Scene en nuestro archivo second_animations.py, así que nos está preguntando cuál de las dos queremos renderizar. Le metemos el numerito correspondiente, en este caso el 2, y ahora sí que nos renderiza la animación nueva.

¡Menuda chulada!