Ir al contenido

Rate functions

Las animaciones que hemos hecho hasta ahora tienen un ritmo particular. Pareciera que empieza lento y poco a poco va acelerando hasta que vuelve a frenar.

Esto es debido a las rate_functions: funciones que definen que tan rápido progresa una animación. La documentación de Manim nos ofrece unas gráficas que ayudan a aclarar cómo funcionan las rate_functions visualmente:

Para que queden aún más claras, vamos a hacer animaciones que representen algunas de estas funciones.

rate_funcs_example.py
from manim import *
class RateFuncsExample(Scene):
def construct(self):
colors = [
RED,
GREEN,
BLUE,
YELLOW,
PURPLE
]
dots = VGroup(
[Dot(color=colors[i]) for i in range(5)]
).scale(4).arrange(DOWN).to_edge(LEFT)
self.add(dots)
self.wait()
self.play(
ApplyMethod(dots[0].to_edge, RIGHT, rate_func=rate_functions.smooth),
ApplyMethod(dots[1].to_edge, RIGHT, rate_func=rate_functions.double_smooth),
ApplyMethod(dots[2].to_edge, RIGHT, rate_func=rate_functions.there_and_back),
ApplyMethod(dots[3].to_edge, RIGHT, rate_func=rate_functions.ease_in_bounce),
ApplyMethod(dots[4].to_edge, RIGHT, rate_func=rate_functions.ease_in_out_elastic),
run_time=5
)
self.wait()

Combina lo aprendido en este apartado y en el apartado anterior de Grupos de Animaciones y juega un poco a ver qué consigues.

Solución al ejercicio 1
rate_funcs_ex_1.py
from manim import *
class RateFuncsExerciseOne(Scene):
def construct(self):
dots = VGroup([Dot(color=random_color()) for _ in range(10)]).scale(2).arrange(RIGHT).to_edge(DOWN)
self.add(dots)
self.wait()
self.play(
LaggedStart(
*[dot.animate(rate_func=rate_functions.ease_in_bounce).shift(5*UP) for dot in dots],
lag_ratio=0.1,
),
run_time=10
)

Las rate_functions son funciones que dependen de una variable temporal t que va de 0 a 1. Crea una rate_function propia y aplícala a una animación.

Solución al ejercicio 2
rate_funcs_ex_2.py
from manim import *
from math import sin, tan
def sin_rate_func(t: float) -> float:
if t == 0:
return 0
else:
return sin(2*PI*t)
def tan_rate_func(t: float) -> float:
if t == 0:
return 0
else:
return tan(2*PI*t)
class RateFuncsExerciseTwo(Scene):
def construct(self):
dots = VGroup([Dot(color=random_color()) for _ in range(10)]).scale(2).arrange(RIGHT)
self.add(dots)
self.wait()
self.play(
LaggedStart(
*[dot.animate(rate_func=sin_rate_func).shift(2*UP) for dot in dots],
lag_ratio=0.1,
),
run_time=10
)
self.play(
LaggedStart(
*[dot.animate(rate_func=tan_rate_func).shift(2*UP) for dot in dots],
lag_ratio=0.1,
),
run_time=10
)