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