Manim實現氣泡特效
本文將介紹如何使用Manim框架實現一個簡單而實用的氣泡特效,該特效可用于多種場景,如背景裝飾、數據可視化過渡等。
1. 實現原理
氣泡特效的核心在于BubbleEffect類,它繼承自Manim的Animation類,通過重寫關鍵方法來實現氣泡的上升、變大和透明度變化效果。
1.1. 核心類結構
BubbleEffect類的基本結構如下:
class BubbleEffect(Animation):
"""
彩色氣泡特效動畫類
繼承自Animation類,用于創建彩色氣泡上升、變大、透明度變化的效果
"""
def __init__(
self,
bubble_count=25, # 氣泡數量
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), # 消失速度范圍
colors=None, # 氣泡顏色列表
**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(radius=size, color=color, fill_opacity=0.4, stroke_width=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.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 bubble
1.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(opacity=0.4)
bubble.set_stroke(opacity=0.4)
else:
bubble.set_fill(opacity=new_opacity)
bubble.set_stroke(opacity=new_opacity)
這個方法實現了三個關鍵效果:
- 上升:每個氣泡以自己的速度向上移動
- 變大:每個氣泡以自己的速度緩慢變大
- 透明度變化:每個氣泡逐漸變得透明
特別值得注意的是,當氣泡超出屏幕頂部或透明度降到0以下時,代碼會將氣泡重置到底部,從而實現循環不斷的氣泡效果。
2. 使用示例
代碼提供了兩個使用示例,分別展示了普通氣泡效果和彩色氣泡效果。
2.1. 普通氣泡效果
SimpleBubbleEffectExample類展示了如何創建灰度的氣泡效果:
class SimpleBubbleEffectExample(Scene):
"""普通氣泡特效示例場景"""
def construct(self):
# 創建標題
title = Text("普通氣泡特效演示", font_size=48)
title.to_edge(UP)
self.play(Write(title))
self.wait(0.5)
bubble_effect = BubbleEffect(
bubble_count=25,
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_time=2, # 使用run_time而不是duration
)
# 播放氣泡特效
self.play(bubble_effect)
self.wait()

2.2. 彩色氣泡效果
ColorfulBubbleEffectExample類展示了如何創建彩色的氣泡效果:
class ColorfulBubbleEffectExample(Scene):
"""彩色氣泡特效示例場景"""
def construct(self):
# 創建標題
title = Text("彩色氣泡特效演示", font_size=48)
title.to_edge(UP)
self.play(Write(title))
self.wait(0.5)
# 創建彩色氣泡特效動畫
bubble_effect = BubbleEffect(
bubble_count=25,
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_time=2, # 使用run_time而不是duration
)
# 播放彩色氣泡特效
self.play(bubble_effect)
self.wait()
兩者的主要區別在于SimpleBubbleEffectExample顯式指定了colors=[GRAY],而ColorfulBubbleEffectExample則使用了默認的彩色列表。

2.3. 自定義參數
BubbleEffect類提供了多個參數,可以根據需要進行調整:
| 參數名 | 類型 | 默認值 | 說明 |
|---|---|---|---|
| bubble_count | int | 25 | 氣泡數量 |
| bubble_size_range | tuple | (0.1, 0.5) | 氣泡大小范圍 |
| rise_speed_range | tuple | (0.6, 2.2) | 氣泡上升速度范圍 |
| growth_rate_range | tuple | (0.005, 0.015) | 氣泡生長速度范圍 |
| fade_rate_range | tuple | (0.02, 0.06) | 氣泡透明度變化速度范圍 |
| colors | list | [RED, BLUE, GREEN, YELLOW, PURPLE, ORANGE] | 氣泡顏色列表 |
| run_time | float | 5.0 | 動畫運行時間 |
通過調整這些參數,可以創建各種不同風格的氣泡效果。
3. 總結
3.1. 特效特點
- 可定制性強:通過調整多種參數,可以創建不同風格的氣泡效果
- 性能優化:使用VGroup統一管理氣泡,方便添加和刪除
- 循環動畫:氣泡消失后會自動重置,實現循環不斷的效果
- 隨機性:每個氣泡的大小、位置、速度等屬性都是隨機的,創建豐富多變的視覺效果
- 統一控制:作為Animation的子類,可以與Manim的其他動畫無縫集成
3.2. 使用場景
- 背景裝飾:為視頻或演示添加動態背景
- 轉場效果:在不同場景或章節之間作為過渡效果
- 數據可視化:與數據展示結合,增強視覺吸引力
- 節日氛圍:通過調整顏色,可以創建適合不同節日的氛圍效果
- 教學輔助:在物理課上演示浮力原理,或在化學課上模擬氣泡反應
這個氣泡特效實現簡單但效果出色,可以為各種Manim動畫項目增添生動的視覺元素。

浙公網安備 33010602011771號