气泡特效的核心在于BubbleEffect类,它继承自Manim的Animation类,通过重写关键方法来实现气泡的上升、变大和透明度变化效果。

发布时间:2026/7/1 1:38:44
气泡特效的核心在于BubbleEffect类,它继承自Manim的Animation类,通过重写关键方法来实现气泡的上升、变大和透明度变化效果。 核心类结构BubbleEffect类的基本结构如下class BubbleEffect(Animation): 彩色气泡特效动画类 继承自Animation类用于创建彩色气泡上升、变大、透明度变化的效果 def __init__( self, bubble_count25, # 气泡数量 bubble_size_range(0.1, 0.5), # 气泡大小范围 rise_speed_range(0.6, 2.2), # 上升速度范围 growth_rate_range(0.005, 0.015), # 生长速度范围 fade_rate_range(0.02, 0.06), # 消失速度范围 colorsNone, # 气泡颜色列表 **kwargs ): # 初始化代码... def create_bubble(self): # 创建单个气泡的代码... def interpolate_mobject(self, alpha): # 控制气泡动画效果的核心代码...1.2. 气泡创建机制在__init__方法中我们首先定义了一系列参数如气泡数量、大小范围、上升速度等然后创建一个VGroup来存放所有气泡# 创建气泡组 self.bubbles VGroup() self.bubble_count bubble_count self.bubble_size_range bubble_size_range self.rise_speed_range rise_speed_range self.growth_rate_range growth_rate_range self.fade_rate_range fade_rate_range self.colors colors or [RED, BLUE, GREEN, YELLOW, PURPLE, ORANGE] # 保存运行时间从kwargs中获取或使用默认值 self.run_time kwargs.get(run_time, 5.0) # 初始化气泡 for _ in range(bubble_count): bubble self.create_bubble() self.bubbles.add(bubble) # 调用父类初始化 super().__init__(self.bubbles, **kwargs)每个气泡通过create_bubble方法创建该方法随机设置气泡的大小、颜色和初始位置并为每个气泡分配独立的上升速度、生长速度和消失速度def create_bubble(self): 创建单个彩色气泡 # 随机大小 size random.uniform(*self.bubble_size_range) # 随机颜色 color random.choice(self.colors) # 创建圆形气泡 bubble Circle(radiussize, colorcolor, fill_opacity0.4, stroke_width2) # 随机初始位置底部区域 x_pos random.uniform(-config.frame_width / 2 1, config.frame_width / 2 - 1) y_pos random.uniform(-config.frame_height / 2, -config.frame_height / 2 2) bubble.move_to([x_pos, y_pos, 0]) # 存储气泡属性 bubble.rise_speed random.uniform(*self.rise_speed_range) bubble.growth_rate random.uniform(*self.growth_rate_range) bubble.fade_rate random.uniform(*self.fade_rate_range) bubble.initial_radius size return bubble1.3. 动画插值实现动画的核心在于interpolate_mobject方法它控制着每个气泡在每一帧的状态变化def interpolate_mobject(self, alpha): 插值函数控制彩色气泡的动画效果 dt 1 / config.frame_rate # 每帧的时间间隔 for bubble in self.bubbles: # 上升 bubble.shift(UP * bubble.rise_speed * dt) # 变大 bubble.scale(1 bubble.growth_rate * dt) # 透明度变化 current_opacity bubble.get_fill_opacity() new_opacity current_opacity - bubble.fade_rate * dt # 如果气泡超出屏幕顶部或透明度降到0以下则重置 if new_opacity 0 or bubble.get_y() config.frame_height / 2: # 重置气泡 x_pos random.uniform( -config.frame_width / 2 1, config.frame_width / 2 - 1 ) y_pos random.uniform( -config.frame_height / 2, -config.frame_height / 2 2 ) bubble.move_to([x_pos, y_pos, 0]) bubble.set_fill(opacity0.4) bubble.set_stroke(opacity0.4) else: bubble.set_fill(opacitynew_opacity) bubble.set_stroke(opacitynew_opacity)这个方法实现了三个关键效果上升每个气泡以自己的速度向上移动变大每个气泡以自己的速度缓慢变大透明度变化每个气泡逐渐变得透明特别值得注意的是当气泡超出屏幕顶部或透明度降到0以下时代码会将气泡重置到底部从而实现循环不断的气泡效果。2. 使用示例代码提供了两个使用示例分别展示了普通气泡效果和彩色气泡效果。2.1. 普通气泡效果SimpleBubbleEffectExample类展示了如何创建灰度的气泡效果class SimpleBubbleEffectExample(Scene): 普通气泡特效示例场景 def construct(self): # 创建标题 title Text(普通气泡特效演示, font_size48) title.to_edge(UP) self.play(Write(title)) self.wait(0.5) bubble_effect BubbleEffect( bubble_count25, colors[GRAY], # 设置为灰色 bubble_size_range(0.1, 0.5), rise_speed_range(0.6, 2.2), growth_rate_range(0.1, 0.5), fade_rate_range(0.02, 0.06), run_time2, # 使用run_time而不是duration ) # 播放气泡特效 self.play(bubble_effect) self.wait()2.2. 彩色气泡效果ColorfulBubbleEffectExample类展示了如何创建彩色的气泡效果class ColorfulBubbleEffectExample(Scene): 彩色气泡特效示例场景 def construct(self): # 创建标题 title Text(彩色气泡特效演示, font_size48) title.to_edge(UP) self.play(Write(title)) self.wait(0.5) # 创建彩色气泡特效动画 bubble_effect BubbleEffect( bubble_count25, bubble_size_range(0.1, 0.5), rise_speed_range(0.6, 2.2), growth_rate_range(0.1, 0.5), fade_rate_range(0.02, 0.06), run_time2, # 使用run_time而不是duration ) # 播放彩色气泡特效