在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
相关产品推荐
相关产品推荐

