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

