Search code examples
manim

How to control self.play run at specific time point


Suppose there are two self.play statements, the first starts at 1s, I want to the seconds start at precisely 3s from the begining.

Currently I use self.wait to control the steps:

self.wait(1)
self.play...... # first animation
self.wait(2)    # because 1 + 2 = 3
self.play...... # second animation

However, because the first animation will take sometime (e.g. 1.5s) to finish, actually the second animation will start at 1 + 1.5 + 2 = 4.5s.

How can I make the second self.play start run at precisely 3s from the begining? Thanks in advance.


Solution

  • Do you mean, this?

    class SuccessionExample(Scene):
        def construct(self):
            number_line=NumberLine(x_min=-2,x_max=2)
            triangle=RegularPolygon(3,start_angle=-PI/2)\
                       .scale(0.2)\
                       .next_to(number_line.get_left(),UP,buff=SMALL_BUFF)
            text_1=TextMobject("1")\
                   .next_to(number_line.get_tick(-1),DOWN)
            text_2=TextMobject("2")\
                   .next_to(number_line.get_tick(0),DOWN)
            text_3=TextMobject("3")\
                   .next_to(number_line.get_tick(1),DOWN)
            text_4=TextMobject("4")\
                   .next_to(number_line.get_tick(2),DOWN)
    
            self.add(number_line)
            self.play(ShowCreation(triangle))
            self.wait(0.3)
    
            self.play(
                        #The move of the triangle starts
                        ApplyMethod(triangle.shift,RIGHT*4,rate_func=linear,run_time=4),
    
                        AnimationGroup(
                            Animation(Mobject(),run_time=1),#<- one second pause
                            Write(text_1),lag_ratio=1       #<- then start Write animation
                        ),
                        AnimationGroup(
                            Animation(Mobject(),run_time=2),#<- two seconds pause
                            Write(text_2),lag_ratio=1       #<- then start Write animation
                        ),
                        AnimationGroup(
                            Animation(Mobject(),run_time=3),#<- three seconds pause
                            Write(text_3),lag_ratio=1       #<- then start Write animation
                        ),
                        AnimationGroup(
                            Animation(Mobject(),run_time=4),#<- four seconds pause
                            Write(text_4),lag_ratio=1       #<- then start Write animation
                        ),
                )
    
            self.wait()