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

在Manim中使用ValueTracker动画多个数值时部分元素消失的问题

问题原因及修复方案

你的代码中,num2和num3的位置设置逻辑有误:to_edge(LEFT)和to_edge(RIGHT)是直接调用在always_redraw返回的对象上,但always_redraw的核心逻辑是每次重绘时都会执行lambda生成全新的DecimalNumber实例——而这个新生成的数字并没有被设置位置属性,所以当k的数值变化触发重绘时,新的num2、num3会回到默认位置(通常是屏幕中心,和num1重叠,看起来就像消失了)。

修复方案一:将位置设置放入lambda内部

确保每次生成新数字时都同步设置位置:

class ValueTrackers(Scene):
    def construct(self):
        k = ValueTracker(3.5)
        num1 = always_redraw(lambda : DecimalNumber().set_value(k.get_value()))
        num2 = always_redraw(lambda : DecimalNumber().set_value(k.get_value()).to_edge(LEFT))
        num3 = always_redraw(lambda : DecimalNumber().set_value(k.get_value()).to_edge(RIGHT))
        self.play(Create(VGroup(num1, num2, num3)))
        self.wait()
        self.play(k.animate.set_value(0), run_time=3)

修复方案二:复用DecimalNumber对象(更高效)

先初始化带位置的数字对象,再用always_redraw仅更新数值,避免频繁创建新对象:

class ValueTrackers(Scene):
    def construct(self):
        k = ValueTracker(3.5)
        # 初始化时就设置好位置和初始值
        num1 = DecimalNumber().set_value(k.get_value())
        num2 = DecimalNumber().set_value(k.get_value()).to_edge(LEFT)
        num3 = DecimalNumber().set_value(k.get_value()).to_edge(RIGHT)
        
        # 添加到场景,并用always_redraw绑定数值更新逻辑
        self.add(num1, num2, num3)
        self.add(always_redraw(lambda: num1.set_value(k.get_value())))
        self.add(always_redraw(lambda: num2.set_value(k.get_value())))
        self.add(always_redraw(lambda: num3.set_value(k.get_value())))
        
        self.wait()
        self.play(k.animate.set_value(0), run_time=3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:55:37