news 2026/7/5 14:46:28

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

作者头像

张小明

前端开发工程师

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

核心类结构

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)

这个方法实现了三个关键效果:

  1. 上升:每个气泡以自己的速度向上移动
  2. 变大:每个气泡以自己的速度缓慢变大
  3. 透明度变化:每个气泡逐渐变得透明

特别值得注意的是,当气泡超出屏幕顶部或透明度降到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 ) # 播放彩色气泡特效
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 6:37:12

一文搞懂巴别鸟版本管理:从历史回溯到冲突解决的完整攻略

一文搞懂巴别鸟版本管理&#xff1a;从历史回溯到冲突解决的完整攻略 作为企业内部文件管理的核心能力&#xff0c;版本管理在企业云盘选型时往往被低估。很多团队选型只看存储空间和价格&#xff0c;等真正用起来才发现"文件版本混乱、协作冲突不断、历史记录查不到"…

作者头像 李华
网站建设 2026/7/4 16:22:05

河南AI大模型人才培养观察:从通识普及到产业实战的多元路径

在人工智能技术加速落地的2026年&#xff0c;AI大模型已从技术圈的热词变为重构各行各业的基础设施。从自然语言处理到多模态生成&#xff0c;大模型正在深刻改变人与信息的交互方式。在这个技术普及的关键节点&#xff0c;河南作为中部地区重要的数字经济发展高地&#xff0c;…

作者头像 李华
网站建设 2026/7/4 11:54:54

快马AI三步搭建OpenClaw安卓自动化测试环境:告别手动配置噩梦

1. 项目概述&#xff1a;为什么我们需要“快马AI”来搭建安卓自动化测试环境&#xff1f;如果你是一名移动端测试工程师&#xff0c;或者正在尝试将自动化测试引入你的团队&#xff0c;那么“环境配置”这四个字&#xff0c;大概率是你职业生涯中挥之不去的噩梦。从JDK版本冲突…

作者头像 李华
网站建设 2026/7/4 8:00:32

别乱改!Multisim14.2三极管仿真参数修改的实战避坑指南(以2N3904为例)

Multisim14.2三极管仿真参数修改的实战避坑指南&#xff1a;以2N3904为例在电子工程仿真领域&#xff0c;Multisim作为行业标准工具链中的重要一环&#xff0c;其SPICE模型参数的准确性直接决定了仿真结果的可信度。许多初学者在对比理论计算与仿真结果时&#xff0c;常会陷入一…

作者头像 李华
网站建设 2026/7/4 6:40:15

把 quicklink 的预加载思想搬到 API 层:我设计了一套‘懒请求调度器’,首屏并发从 9 降到了 2

背景 运营后台的仪表盘页面有 9 个图表组件,每个都要调后端 API。用户一进来,9 个请求同时发出,后端扛不住,前端首屏等最慢的那个 API(1.8s)。 常规方案是给每个图表加一个"进入视口再加载"。用 IntersectionObserver 实现,大概是每个组件里加一段: const…

作者头像 李华