在manim中异步运行不同的动画

2024-04-18 01:26:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试运行两个动画(参考以下代码):

class RelTrain(Scene):
    def construct(self):
        train = Rectangle(height=1, width=4)
        train2 = Rectangle(height=2, width=2)
        train.move_to(np.array([-10,0,0]))
        train2.move_to(np.array([0,0,0]))
        self.add(train, train2)
        self.play(
            train.move_to, np.array([10,0,0]),
            train2.move_to, np.array([15,0,0]),
            run_time=18,
            rate_func=linear,
        )
        self.wait()

基本上两个矩形都在移动,但我不希望它们同时开始移动。我希望train开始移动,2秒后(train此时仍然会移动,因为run_time=18),我希望train2在屏幕上弹出并开始移动。我不知道这是如何做到的,如果有任何帮助,我将不胜感激


Tags: torun代码selfmovetimenptrain
1条回答
网友
1楼 · 发布于 2024-04-18 01:26:21

在玩了一段时间之后,我想出了如何使用ManimCE(v0.3.0)来实现这一点。这还没有很好的文档记录,但基本上可以使用mobject updaters。我不确定这是否是最好的方法(在我看来,这太冗长了,层次太低),但它确实有效:

代码


import numpy as np
from manim import *

class DeplayedTrains(Scene):
    def construct(self):
        # create both trains
        trains = (
            Rectangle(height=1, width=4),
            Rectangle(height=2, width=2),
        )
        
        # indicate start and end points
        start_points_X, end_points_X = ((-5, 0), (5, 5))
        # compute movement distances for both trains
        distances = (
            (end_points_X[0] - start_points_X[0]),
            (end_points_X[1] - start_points_X[1]),
        )
        
        # place trains at start points and add to the scene
        for train, start_point in zip(trains, start_points_X):
            train.move_to(np.array([start_point, 0, 0]))
            self.add(train)
        
        # deifine durations of movements for both trains, get FPS from config
        durations, fps = ((5, 3), config["frame_rate"])
        
        # create updaters
        updaters = (
            # add to the current position in X the difference for each frame, 
            # given the distance and duration defined
            lambda mobj, dt: mobj.set_x(mobj.get_x() + (distances[0] / fps / durations[0])),
            lambda mobj, dt: mobj.set_x(mobj.get_x() + (distances[1] / fps / durations[1])),
        )
        
        # add updaters to trains objects, movement begins
        trains[0].add_updater(updaters[0])
        # wait 2 seconds
        self.wait(2)
        
        # start the movement of the second train and wait 3 seconds
        trains[1].add_updater(updaters[1])
        self.wait(3)
        
        # remove the updaters
        trains[0].clear_updaters()  # you can also call trains[0].remove_updater(updaters[0])
        trains[1].clear_updaters()

Output

相关问题 更多 >

    热门问题