More control in animations#
[1]:
from manim_presenter import *
config.media_embed = True
config.media_width = "100%"
_RV = "-v WARNING -qm --fps=15 --progress_bar None --disable_caching Example"
_RI = "-v WARNING -s --progress_bar None --disable_caching Example"
config.disable_caching = True
Manim Community v0.17.3
[2]:
%cat ./scripts/slides01.txt
<== p01
Dui ultricies volutpat at tristique amet lacus vivamus, in tempus orci pellentesque, dui euismod sit suscipit, viverra pulvinar nulla dui.
==>
<== p02
Tellus consectetur tortor, elementum amet ut dolor eu est nibh varius enim, ut felis tristique efficitur lectus vestibulum eu et ultrices nascetur consectetur praesent non eu non dictum sem.
==>
<== p03
Magna purus ac fermentum eleifend vitae nullam eros, molestie justo rutrum, eleifend ex tortor quis porttitor id aliquet nullam habitasse pharetra ligula posuere.
==>
<== p04
Velit libero nibh vel praesent arcu congue nullam massa enim est risus nulla ante nullam, velit metus nullam faucibus ac efficitur diam leo.
==>
[3]:
jt = lambda mob: JustifyText(mob, tex_width=8)
def LaggedFadeIn(mob, *args, **kwargs):
return LaggedStartMap(FadeIn, mob[0], *args, **kwargs)
SLIDES = [
# SLIDES 1
{
"slide": "s01",
"arrange": [lambda mob: mob.arrange(DOWN, buff=1)],
"elements" : [
{
"name": "p01",
"type": jt,
"creation": Write
},{
"name": "p02",
"type": jt,
"creation": LaggedFadeIn # <-
# Not use lambda mob: LaggedStartMap(FadeIn, mob[0])
}
],
},
# SLIDES 2
{
"slide": "s02",
"arrange": [lambda mob: mob.arrange(DOWN, buff=1)],
"elements" : [
{
"name": "p03",
"type": jt,
},{
"name": "p04",
"type": jt,
}
],
},
]
Creation and progress#
Each element receives a special key called creation
that can be used in progress
, an arrangement where the progress of each animation can be indicated with more control.
[4]:
class Example(Presentation):
file = "slides01.txt"
slides = [
{
"slide": "s01",
"class": VGroup,
"remove_same_time": FadeOut,
# **SLIDES[0],
"arrange": [lambda mob: mob.arrange(DOWN, buff=1)],
"elements" : [
{
"name": "p01",
"type": jt,
"creation": Write
},{
"name": "p02",
"type": jt,
"creation": LaggedFadeIn # <-
# Not use lambda mob: LaggedStartMap(FadeIn, mob[0])
}
],
"progress": [
{"create": "p01"},
{"wait": 1},
{"create": "p02"},
{"wait": 1},
]
}
]
preview_anims = ["s01"] # <-
%manim $_RV
You can also specify run_time
, rate_func
and remover
.
[5]:
class Example(Presentation):
file = "slides01.txt"
slides = [
{
"class": VGroup,
"remove_same_time": FadeOut,
"slide": "s01",
# **SLIDES[0],
"arrange": [lambda mob: mob.arrange(DOWN, buff=1)],
"elements" : [
{
"name": "p01",
"type": jt,
"creation": Write
},{
"name": "p02",
"type": jt,
"creation": LaggedFadeIn # <-
# Not use lambda mob: LaggedStartMap(FadeIn, mob[0])
}
],
"progress": [
{"create": "p01", "run_time": 3, "rate_func": there_and_back, "remover": True},
{"wait": 0.5},
{"create": "p02", "run_time": 3},
]
}
]
preview_anims = ["s01"] # <-
%manim $_RV
If we want to have more control over the animations we can use play
.
[6]:
class Example(Presentation):
file = "slides01.txt"
slides = [
{
"class": VGroup,
"remove_same_time": FadeOut,
"slide": "s02",
# **SLIDE[1]
"arrange": [lambda mob: mob.arrange(DOWN, buff=1)],
"elements" : [
{
"name": "p03",
"type": jt,
"methods": [lambda m: m.set_color(TEAL)]
},{
"name": "p04",
"type": lambda mob: JustifyText(mob, color=PINK),
}
],
"progress": [
{"play": lambda n: Write(n("p03"), rate_func=there_and_back, run_time=3)},
{"play": lambda n: LaggedStartMap(FadeIn, n("p04"), run_time=3)},
]
}
]
preview_anims = ["s02"] # <-
%manim $_RV
If you want to create “classic” scenes you can use sub_scene
, and if it receives parameters you can give them in an array.
[7]:
class SubScene:
def create_title(self):
t = Tex("\\sc This is a title").scale(2)
self.play(Write(t))
self.play(Indicate(t))
self.play(FadeOut(t))
def shift_mob(self, mob, direction):
self.play(
mob.animate(rate_func=there_and_back).shift(direction)
)
class Example(Presentation, SubScene):
file = "slides01.txt"
slides = [
{
"class": VGroup,
# "remove_same_time": FadeOut,
"slide": "s02",
# **SLIDE[1]
"arrange": [lambda mob: mob.arrange(DOWN, buff=1)],
"elements" : [
{
"name": "p03",
"type": jt,
"methods": [lambda m: m.set_color(TEAL)]
},{
"name": "p04",
"type": jt,
"methods": [lambda m: m.set_color(RED)]
}
],
"progress": [
{"sub_scene": "create_title"},
# self.play(Write(p03), FadeIn(p04, shift=DOWN))
{"play": lambda n: [Write(n("p03")), FadeIn(n("p04"), shift=DOWN)]},
{"sub_scene": ["shift_mob", "p04", RIGHT]},
# self.play(FadeOut(p03, p04))
{"play": lambda n: FadeOut(n("p03"), n("p04"))},
]
}
]
preview_anims = ["s02"] # <-
%manim $_RV
If one of the parameters is strings, you must use a lambda function.
[8]:
class SubScene:
def create_title(self, text_f):
title = Tex(text_f()).scale(2)
under_line = Underline(title)
grp = VGroup(title, under_line)
self.title_grp = grp
self.play(
Write(title),
GrowFromCenter(under_line)
)
self.play(grp.animate.to_edge(UP))
def remove_title(self):
self.play(FadeOut(self.title_grp))
class Example(Presentation, SubScene):
file = "slides01.txt"
slides = [
{
"class": VGroup,
"remove_same_time": AnimWrapper(FadeOut, shift=LEFT*3),
"slide": "s02",
# **SLIDE[1]
"arrange": [lambda mob: mob.arrange(DOWN, buff=1).to_edge(DOWN)],
"elements" : [
{
"name": "p03",
"type": jt,
"methods": [lambda m: m.set_color(TEAL)]
},{
"name": "p04",
"type": jt,
"methods": [lambda m: m.set_color(RED)]
}
],
"progress": [
{"sub_scene": ["create_title", lambda: "{\\bf This} is a title"]},
{"create": "p03"},
{"create": "p04"},
]
}
]
preview_anims = ["s02"] # <-
%manim $_RV
[9]:
class SubScene:
def create_title(self, text_f):
title = Tex(text_f()).scale(2)
under_line = Underline(title)
grp = VGroup(title, under_line)
self.title_grp = grp
self.play(
Write(title),
GrowFromCenter(under_line)
)
self.play(grp.animate.to_edge(UP))
jt = lambda mob: JustifyText(mob, tex_width=8)
def LaggedFadeIn(mob, *args, **kwargs):
return LaggedStartMap(FadeIn, mob[0], *args, **kwargs)
SLIDES = [
# SLIDE 1
{
"slide": "s01",
"arrange": [lambda mob: mob.arrange(DOWN, buff=1)],
"remove_same_time": FadeOut,
"elements" : [
{
"name": "p01",
"type": jt,
"creation": PopUp
},{
"name": "p02",
"type": jt,
"creation": ShowWithBounce
}
],
"progress": [
{"sub_scene": ["create_title", lambda: "First title"]},
{"create": "p01"},
{"create": "p02"},
]
},
# SLIDE 2
{
"slide": "s02",
"arrange": [lambda mob: mob.arrange(DOWN, buff=1)],
"remove_same_time": FadeOut,
"elements" : [
{
"name": "p03",
"type": jt,
"creation": ShowFromPolygon,
},{
"name": "p04",
"type": jt,
"creation": FadeInFromBlackRectangle,
}
],
"progress": [
{"sub_scene": ["create_title", lambda: "Second title"]},
{"create": "p03"},
{"create": "p04"},
]
},
]
class Example(Presentation, SubScene):
file = "slides01.txt"
slides = SLIDES
%manim $_RV