Manim中多Mobject交替淡入淡出效果的代码实现咨询
解决Manim中多个圆交替淡入淡出的问题
问题分析
你的Trial 1写法无效的原因是:把所有淡入动画按顺序执行完后,立刻按顺序执行所有淡出动画,中间没有任何间隔,导致圆刚淡入就立刻淡出,视觉上完全看不到效果。更关键的是,这种逻辑本质还是先全淡入再全淡出,完全不符合你要的“部分消失后其余出现”的交替需求。
解决方案
根据你要的“部分圆消失后其余圆出现”的核心需求,这里提供两种实用实现方式:
方式1:分批交替(先淡出一批,同步淡入另一批)
如果需要先让一部分圆淡出,同时让另一部分圆淡入,可将圆分成两组,把对应淡出和淡入动画配对后同步执行:
from manim import * class MultiMobjectFadeInAndOut(Scene): def construct(self): # 创建10个圆,先全部添加到场景并设为透明(默认不可见) circles = [Circle(r / 10) for r in range(10)] self.add(*circles) for c in circles: c.set_opacity(0) # 分组:前5个为初始显示组,后5个为交替显示组 group_initial = circles[:5] group_alternate = circles[5:] # 先逐个淡入初始组 self.play(LaggedStart(*[FadeIn(c, scale=10) for c in group_initial], lag_ratio=0.1)) self.wait(0.5) # 停留片刻,让观众看清 # 生成配对动画:初始组的圆淡出时,交替组的圆同步淡入 paired_anims = [ AnimationGroup(FadeOut(out_c, scale=10), FadeIn(in_c, scale=10)) for out_c, in_c in zip(group_initial, group_alternate) ] # 按顺序执行这些配对动画组 self.play(LaggedStart(*paired_anims, lag_ratio=0.1)) self.wait(0.5) # 最后淡出交替组 self.play(LaggedStart(*[FadeOut(c, scale=10) for c in group_alternate], lag_ratio=0.1))
方式2:交错交替(逐个圆淡出+下一个圆淡入)
如果需要实现“第一个圆淡出时第二个圆淡入,第三个圆淡出时第四个圆淡入”的交错效果,可直接将相邻圆的动画配对:
from manim import * class MultiMobjectFadeInAndOut(Scene): def construct(self): circles = [Circle(r / 10) for r in range(10)] self.add(*circles) for c in circles: c.set_opacity(0) # 先让所有圆逐个淡入(可选,根据需求决定是否保留) self.play(LaggedStart(*[FadeIn(c, scale=10) for c in circles], lag_ratio=0.1)) self.wait(0.5) # 生成交错动画组:偶数索引圆淡出,奇数索引圆同步淡入(反之亦可) anim_groups = [] for i in range(0, len(circles), 2): # 处理偶数索引的圆淡出 fade_out_anim = FadeOut(circles[i], scale=10) # 处理下一个奇数索引的圆淡入(如果存在) if i + 1 < len(circles): fade_in_anim = FadeIn(circles[i+1], scale=10) if circles[i+1].get_opacity() == 0 else FadeOut(circles[i+1], scale=10) anim_groups.append(AnimationGroup(fade_out_anim, fade_in_anim)) else: anim_groups.append(fade_out_anim) # 按顺序执行交错动画 self.play(LaggedStart(*anim_groups, lag_ratio=0.1))
关键注意点
- 必须先将所有圆添加到场景中,否则未加入场景的Mobject无法执行动画;初始设为透明是为了控制初始状态。
AnimationGroup用于让多个动画同步执行,LaggedStart用于控制动画组的启动延迟间隔,调整lag_ratio可以改变动画的快慢节奏。- 可通过
self.wait()添加停留时长,让动画过渡更自然。
内容的提问来源于stack exchange,提问作者masaya
相关产品推荐
相关产品推荐

