You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Manim中使用LaggedStart类后动画无法放大的问题求助

Manim中使用LaggedStart后ValueTracker无法更新图形的问题解决

我是Manim新手,跟着Brian Amedee的教程用updater函数(结合always_redraw和ValueTracker)实现图形放大效果。分开播放各动画对象时功能正常,但用LaggedStart类组合播放后,后续执行r.animate.set_value(2)无法让图形放大。

使用LaggedStart的代码(问题复现)

from manim import *

class CircleGettingBigger(Scene):
    def construct(self):
        r = ValueTracker(0.5)

        circle = always_redraw(lambda : 
                        Circle(radius = r.get_value(), stroke_color = YELLOW,
                        stroke_width = 5)
                )
        
        line_radius = always_redraw(lambda:
                      Line(start = circle.get_center(), end = circle.get_bottom(), stroke_color = RED_B, stroke_width = 10)
        )

        triangle = always_redraw(lambda :
                    Polygon(circle.get_top(), circle.get_left(), circle.get_right(), stroke_color = GREEN_C)
        )
        self.play(LaggedStart(
            Create(circle), 
            DrawBorderThenFill(line_radius), 
            DrawBorderThenFill(triangle),
            run_time = 4, 
            lag_ratio = 0.05
        ))

        self.play(r.animate.set_value(2), run_time = 5)

不使用LaggedStart的代码(功能正常)

class CircleGettingBigger(Scene):
    def construct(self):
        r = ValueTracker(0.5)

        circle = always_redraw(lambda : 
                        Circle(radius = r.get_value(), stroke_color = YELLOW,
                        stroke_width = 5)
                )
        
        line_radius = always_redraw(lambda:
                      Line(start = circle.get_center(), end = circle.get_bottom(), stroke_color = RED_B, stroke_width = 10)
        )

        triangle = always_redraw(lambda :
                    Polygon(circle.get_top(), circle.get_left(), circle.get_right(), stroke_color = GREEN_C)
        )
        self.play(Create(circle), run_time = 1)
        self.play(DrawBorderThenFill(line_radius), run_time = 1)
        self.play(DrawBorderThenFill(triangle), run_time = 1)

        self.play(r.animate.set_value(2), run_time = 5)

问题原因

LaggedStart会对传入的动画对象进行内部复制,导致你最初用always_redraw创建的对象,和最终显示在场景中的对象不是同一个实例。后续修改ValueTracker时,lambda函数绑定的是原始对象,而非场景中实际存在的复制对象,因此无法触发图形更新。

解决方法

在调用LaggedStart播放动画前,先把所有always_redraw创建的对象添加到场景中,这样LaggedStart操作的就是场景中已存在的、和lambda绑定的实例,后续ValueTracker更新时就能正常触发重绘。

修改后的代码

from manim import *

class CircleGettingBigger(Scene):
    def construct(self):
        r = ValueTracker(0.5)

        circle = always_redraw(lambda : 
                        Circle(radius = r.get_value(), stroke_color = YELLOW,
                        stroke_width = 5)
                )
        
        line_radius = always_redraw(lambda:
                      Line(start = circle.get_center(), end = circle.get_bottom(), stroke_color = RED_B, stroke_width = 10)
        )

        triangle = always_redraw(lambda :
                    Polygon(circle.get_top(), circle.get_left(), circle.get_right(), stroke_color = GREEN_C)
        )

        # 提前将对象加入场景
        self.add(circle, line_radius, triangle)

        self.play(LaggedStart(
            Create(circle), 
            DrawBorderThenFill(line_radius), 
            DrawBorderThenFill(triangle),
            run_time = 4, 
            lag_ratio = 0.05
        ))

        self.play(r.animate.set_value(2), run_time = 5)

内容的提问来源于stack exchange,提问作者Vector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:57:37