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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:35:33