找回密码
 立即注册
首页 业界区 业界 Manim实现气泡特效

Manim实现气泡特效

捷荀讷 6 天前
本文将介绍如何使用Manim框架实现一个简单而实用的气泡特效,该特效可用于多种场景,如背景装饰、数据可视化过渡等。
1. 实现原理

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

BubbleEffect类的基本结构如下:
  1. class BubbleEffect(Animation):
  2.     """
  3.     彩色气泡特效动画类
  4.     继承自Animation类,用于创建彩色气泡上升、变大、透明度变化的效果
  5.     """
  6.     def __init__(
  7.         self,
  8.         bubble_count=25,  # 气泡数量
  9.         bubble_size_range=(0.1, 0.5),  # 气泡大小范围
  10.         rise_speed_range=(0.6, 2.2),  # 上升速度范围
  11.         growth_rate_range=(0.005, 0.015),  # 生长速度范围
  12.         fade_rate_range=(0.02, 0.06),  # 消失速度范围
  13.         colors=None,  # 气泡颜色列表
  14.         **kwargs
  15.     ):
  16.         # 初始化代码...
  17.     def create_bubble(self):
  18.         # 创建单个气泡的代码...
  19.     def interpolate_mobject(self, alpha):
  20.         # 控制气泡动画效果的核心代码...
复制代码
1.2. 气泡创建机制

在__init__方法中,我们首先定义了一系列参数,如气泡数量、大小范围、上升速度等,然后创建一个VGroup来存放所有气泡:
  1. # 创建气泡组
  2. self.bubbles = VGroup()
  3. self.bubble_count = bubble_count
  4. self.bubble_size_range = bubble_size_range
  5. self.rise_speed_range = rise_speed_range
  6. self.growth_rate_range = growth_rate_range
  7. self.fade_rate_range = fade_rate_range
  8. self.colors = colors or [RED, BLUE, GREEN, YELLOW, PURPLE, ORANGE]
  9. # 保存运行时间,从kwargs中获取或使用默认值
  10. self.run_time = kwargs.get("run_time", 5.0)
  11. # 初始化气泡
  12. for _ in range(bubble_count):
  13.     bubble = self.create_bubble()
  14.     self.bubbles.add(bubble)
  15. # 调用父类初始化
  16. super().__init__(self.bubbles, **kwargs)
复制代码
每个气泡通过create_bubble方法创建,该方法随机设置气泡的大小、颜色和初始位置,并为每个气泡分配独立的上升速度、生长速度和消失速度:
  1. def create_bubble(self):
  2.     """创建单个彩色气泡"""
  3.     # 随机大小
  4.     size = random.uniform(*self.bubble_size_range)
  5.     # 随机颜色
  6.     color = random.choice(self.colors)
  7.     # 创建圆形气泡
  8.     bubble = Circle(radius=size, color=color, fill_opacity=0.4, stroke_width=2)
  9.     # 随机初始位置(底部区域)
  10.     x_pos = random.uniform(-config.frame_width / 2 + 1, config.frame_width / 2 - 1)
  11.     y_pos = random.uniform(-config.frame_height / 2, -config.frame_height / 2 + 2)
  12.     bubble.move_to([x_pos, y_pos, 0])
  13.     # 存储气泡属性
  14.     bubble.rise_speed = random.uniform(*self.rise_speed_range)
  15.     bubble.growth_rate = random.uniform(*self.growth_rate_range)
  16.     bubble.fade_rate = random.uniform(*self.fade_rate_range)
  17.     bubble.initial_radius = size
  18.     return bubble
复制代码
1.3. 动画插值实现

动画的核心在于interpolate_mobject方法,它控制着每个气泡在每一帧的状态变化:
  1. def interpolate_mobject(self, alpha):
  2.     """插值函数,控制彩色气泡的动画效果"""
  3.     dt = 1 / config.frame_rate  # 每帧的时间间隔
  4.     for bubble in self.bubbles:
  5.         # 上升
  6.         bubble.shift(UP * bubble.rise_speed * dt)
  7.         # 变大
  8.         bubble.scale(1 + bubble.growth_rate * dt)
  9.         # 透明度变化
  10.         current_opacity = bubble.get_fill_opacity()
  11.         new_opacity = current_opacity - bubble.fade_rate * dt
  12.         # 如果气泡超出屏幕顶部或透明度降到0以下,则重置
  13.         if new_opacity <= 0 or bubble.get_y() > config.frame_height / 2:
  14.             # 重置气泡
  15.             x_pos = random.uniform(
  16.                 -config.frame_width / 2 + 1, config.frame_width / 2 - 1
  17.             )
  18.             y_pos = random.uniform(
  19.                 -config.frame_height / 2, -config.frame_height / 2 + 2
  20.             )
  21.             bubble.move_to([x_pos, y_pos, 0])
  22.             bubble.set_fill(opacity=0.4)
  23.             bubble.set_stroke(opacity=0.4)
  24.         else:
  25.             bubble.set_fill(opacity=new_opacity)
  26.             bubble.set_stroke(opacity=new_opacity)
复制代码
这个方法实现了三个关键效果:

  • 上升:每个气泡以自己的速度向上移动
  • 变大:每个气泡以自己的速度缓慢变大
  • 透明度变化:每个气泡逐渐变得透明
特别值得注意的是,当气泡超出屏幕顶部或透明度降到0以下时,代码会将气泡重置到底部,从而实现循环不断的气泡效果。
2. 使用示例

代码提供了两个使用示例,分别展示了普通气泡效果和彩色气泡效果。
2.1. 普通气泡效果

SimpleBubbleEffectExample类展示了如何创建灰度的气泡效果:
  1. class SimpleBubbleEffectExample(Scene):
  2.     """普通气泡特效示例场景"""
  3.     def construct(self):
  4.         # 创建标题
  5.         title = Text("普通气泡特效演示", font_size=48)
  6.         title.to_edge(UP)
  7.         self.play(Write(title))
  8.         self.wait(0.5)
  9.         bubble_effect = BubbleEffect(
  10.             bubble_count=25,
  11.             colors=[GRAY],  # 设置为灰色
  12.             bubble_size_range=(0.1, 0.5),
  13.             rise_speed_range=(0.6, 2.2),
  14.             growth_rate_range=(0.1, 0.5),
  15.             fade_rate_range=(0.02, 0.06),
  16.             run_time=2,  # 使用run_time而不是duration
  17.         )
  18.         # 播放气泡特效
  19.         self.play(bubble_effect)
  20.         self.wait()
复制代码
1.gif

2.2. 彩色气泡效果

ColorfulBubbleEffectExample类展示了如何创建彩色的气泡效果:
  1. class ColorfulBubbleEffectExample(Scene):
  2.     """彩色气泡特效示例场景"""
  3.     def construct(self):
  4.         # 创建标题
  5.         title = Text("彩色气泡特效演示", font_size=48)
  6.         title.to_edge(UP)
  7.         self.play(Write(title))
  8.         self.wait(0.5)
  9.         # 创建彩色气泡特效动画
  10.         bubble_effect = BubbleEffect(
  11.             bubble_count=25,
  12.             bubble_size_range=(0.1, 0.5),
  13.             rise_speed_range=(0.6, 2.2),
  14.             growth_rate_range=(0.1, 0.5),
  15.             fade_rate_range=(0.02, 0.06),
  16.             run_time=2,  # 使用run_time而不是duration
  17.         )
  18.         # 播放彩色气泡特效
  19.         self.play(bubble_effect)
  20.         self.wait()
复制代码
两者的主要区别在于SimpleBubbleEffectExample显式指定了colors=[GRAY],而ColorfulBubbleEffectExample则使用了默认的彩色列表。
2.gif

2.3. 自定义参数

BubbleEffect类提供了多个参数,可以根据需要进行调整:
参数名类型默认值说明bubble_countint25气泡数量bubble_size_rangetuple(0.1, 0.5)气泡大小范围rise_speed_rangetuple(0.6, 2.2)气泡上升速度范围growth_rate_rangetuple(0.005, 0.015)气泡生长速度范围fade_rate_rangetuple(0.02, 0.06)气泡透明度变化速度范围colorslist[RED, BLUE, GREEN, YELLOW, PURPLE, ORANGE]气泡颜色列表run_timefloat5.0动画运行时间通过调整这些参数,可以创建各种不同风格的气泡效果。
3. 总结

3.1. 特效特点


  • 可定制性强:通过调整多种参数,可以创建不同风格的气泡效果
  • 性能优化:使用VGroup统一管理气泡,方便添加和删除
  • 循环动画:气泡消失后会自动重置,实现循环不断的效果
  • 随机性:每个气泡的大小、位置、速度等属性都是随机的,创建丰富多变的视觉效果
  • 统一控制:作为Animation的子类,可以与Manim的其他动画无缝集成
3.2. 使用场景


  • 背景装饰:为视频或演示添加动态背景
  • 转场效果:在不同场景或章节之间作为过渡效果
  • 数据可视化:与数据展示结合,增强视觉吸引力
  • 节日氛围:通过调整颜色,可以创建适合不同节日的氛围效果
  • 教学辅助:在物理课上演示浮力原理,或在化学课上模拟气泡反应
这个气泡特效实现简单但效果出色,可以为各种Manim动画项目增添生动的视觉元素。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册