Manim实现涟漪扩散特效

news/2025/9/25 14:47:01/文章来源:https://www.cnblogs.com/wang_yb/p/19111184

在视频制作和数据可视化领域,涟漪扩散特效是一种常见且富有视觉吸引力的动画效果。

本文将详细介绍如何使用Manim数学动画引擎来实现这一效果,包括其实现原理、使用示例以及应用场景。

1. 实现原理

涟漪扩散特效主要通过RippleEffect类来实现,该类继承自Manim的Animation基类。让我们深入了解其核心实现机制:

1.1. 核心设计思路

class RippleEffect(Animation):"""涟漪扩散特效动画类实现方法:使用Circle类创建多个同心圆,然后通过发光层实现发光效果,再利用脉冲效果实现闪烁,从而模拟涟漪的扩散和闪烁。"""

1.2. 参数设计

该类提供了丰富的参数控制,使其具有高度可定制性:

def __init__(self,mobject: Mobject,num_ripples: int = 5,max_radius: float = 3.0,min_radius: float = 0.1,ripple_speed: float = 1.0,color: ParsableManimColor = BLUE,fade_out: bool = True,glow_num: int = 3,glow_width: float = 5,pulse_frequency: float = 2.0,**kwargs
):# 存储参数self.num_ripples = num_ripplesself.max_radius = max_radiusself.min_radius = min_radiusself.ripple_speed = ripple_speedself.color = colorself.fade_out = fade_outself.glow_num = glow_numself.glow_width = glow_widthself.pulse_frequency = pulse_frequency

1.3. 多颜色支持实现

代码巧妙地支持单色和多色两种模式:

# 处理颜色参数,支持单个颜色或多个颜色
if isinstance(color, (list, tuple)):self.colors = list(color)self.use_multiple_colors = True
else:self.colors = [color]self.use_multiple_colors = False

1.4. 涟漪对象初始化

在构造函数中,代码预先创建了所有需要的涟漪圆环和对应的发光层:

# 创建涟漪圆环列表
self.ripples = []
self.glow_layers = []# 创建多个同心圆环作为涟漪
for i in range(num_ripples):# 确定当前涟漪的颜色if self.use_multiple_colors:ripple_color = self.colors[i % len(self.colors)]else:ripple_color = self.colors[0]# 使用Circle创建圆环,初始半径为最小半径circle = Circle(radius=min_radius,stroke_color=ripple_color,stroke_width=2,fill_opacity=0,).move_to(mobject.get_center())self.ripples.append(circle)# 为每个涟漪创建发光层glow_group = []for j in range(glow_num):glow = circle.copy()glow_group.append(glow)self.glow_layers.append(glow_group)

1.5. 动画插值实现

interpolate_mobject方法是实现动画效果的核心,它在每一帧都会被调用:

def interpolate_mobject(self, alpha: float):"""实现动画效果的核心方法Parameters:alpha - 是一个介于 0 和 1 之间的参数,表示动画的进度"""# 计算时间进度,考虑涟漪速度time_alpha = alpha * self.ripple_speed# 为每个涟漪计算不同的相位偏移,创建连续的涟漪效果for i, (ripple, glow_group) in enumerate(zip(self.ripples, self.glow_layers)):# 确定当前涟漪的颜色if self.use_multiple_colors:ripple_color = self.colors[i % len(self.colors)]else:ripple_color = self.colors[0]# 计算每个涟漪的相位偏移phase_offset = i / self.num_ripples# 计算当前涟漪的时间进度ripple_time = (time_alpha + phase_offset) % 1# 计算当前半径,从最小半径到最大半径current_radius = interpolate(self.min_radius, self.max_radius, ripple_time)# 计算透明度,如果启用淡出效果if self.fade_out:# 使用正弦函数创建自然的淡出效果opacity = np.sin(ripple_time * PI) * 0.8else:opacity = 0.8# 确保透明度不为负数opacity = max(0, opacity)# 添加脉冲效果pulse_effect = np.sin(ripple_time * self.pulse_frequency * 2 * PI) * 0.2opacity = max(0, opacity + pulse_effect)# 创建新的圆环并更新属性new_ripple = Circle(radius=current_radius,stroke_color=ripple_color,stroke_width=2,stroke_opacity=opacity,fill_opacity=0,).move_to(self.mobject.get_center())# 更新涟漪对象ripple.become(new_ripple)# 更新发光层for j, glow in enumerate(glow_group):phase = j / self.glow_num# 设置发光层属性glow.become(new_ripple.copy())glow.set_stroke(width=self.glow_width * (1 - phase) + 1,  # 宽度递减color=ripple_color,opacity=opacity * 0.3 * (1 - phase),  # 透明度递减)

这个方法实现了几个关键的视觉效果:

  1. 涟漪扩散:通过计算当前半径,使圆环从中心向外扩散
  2. 涟漪淡出:使用正弦函数创建自然的淡出效果
  3. 脉冲效果:添加额外的正弦波动来模拟涟漪的脉冲闪烁
  4. 发光效果:为每个涟漪添加多层发光效果,并使它们的宽度和透明度递减
  5. 相位偏移:为不同的涟漪设置不同的相位偏移,创造连续的涟漪效果

2. 使用示例

代码提供了三种不同的使用示例,展示了涟漪效果的多样化应用:

2.1. 单颜色涟漪效果

最简单的应用场景,从一个中心点向外扩散单色涟漪:

class RippleEffectExample(Scene):"""涟漪扩散特效示例场景"""def construct(self):# 创建一个点作为涟漪的中心center_dot = Dot(color=YELLOW)self.add(center_dot)# 创建涟漪扩散特效ripple_effect = RippleEffect(center_dot,num_ripples=8,max_radius=4.0,min_radius=0.1,ripple_speed=1.5,color=BLUE,glow_num=5,glow_width=8,pulse_frequency=3.0,)# 将所有涟漪和发光层添加到场景中for ripple, glow_group in zip(ripple_effect.ripples, ripple_effect.glow_layers):self.add(ripple)for glow in glow_group:self.add(glow)# 播放动画self.play(ripple_effect, run_time=5)self.wait()

2.2. 双涟漪效果

展示两个同时扩散的涟漪效果,可以用于表现两个对象之间的交互:

class DualRippleEffectExample(Scene):"""双涟漪扩散特效示例场景展示两个同时扩散的涟漪效果"""def construct(self):# 创建两个点作为涟漪的中心center_dot1 = Dot(color=YELLOW).shift(LEFT * 2)center_dot2 = Dot(color=RED).shift(RIGHT * 2)self.add(center_dot1, center_dot2)# 创建两个涟漪扩散特效ripple_effect1 = RippleEffect(center_dot1,num_ripples=6,max_radius=1.5,min_radius=0.1,ripple_speed=1.2,color=BLUE,glow_num=4,glow_width=6,pulse_frequency=5.5,)ripple_effect2 = RippleEffect(center_dot2,num_ripples=6,max_radius=1.5,min_radius=0.1,ripple_speed=1.2,color=RED,glow_num=8,glow_width=4,pulse_frequency=2.5,)# 将所有涟漪和发光层添加到场景中for ripple, glow_group in zip(ripple_effect1.ripples, ripple_effect1.glow_layers):self.add(ripple)for glow in glow_group:self.add(glow)for ripple, glow_group in zip(ripple_effect2.ripples, ripple_effect2.glow_layers):self.add(ripple)for glow in glow_group:self.add(glow)# 同时播放两个动画self.play(ripple_effect1, ripple_effect2, run_time=5)self.wait()

2.3. 多颜色涟漪效果

最具视觉冲击力的效果,从一个中心点向外扩散多种颜色的涟漪:

class MultiColorRippleEffectExample(Scene):def construct(self):# 创建一个点作为涟漪的中心center_dot = Dot(color=YELLOW)self.add(center_dot)# 创建涟漪扩散特效ripple_effect = RippleEffect(center_dot,num_ripples=8,max_radius=4.0,min_radius=0.1,ripple_speed=1.5,color=[BLUE, RED, GREEN, YELLOW, ORANGE],glow_num=5,glow_width=8,pulse_frequency=3.0,)# 将所有涟漪和发光层添加到场景中for ripple, glow_group in zip(ripple_effect.ripples, ripple_effect.glow_layers):self.add(ripple)for glow in glow_group:self.add(glow)# 播放动画self.play(ripple_effect, run_time=5)self.wait()

3. 总结

3.1. 特效特点

  1. 高度可定制:提供了丰富的参数控制,包括涟漪数量、大小、速度、颜色、发光效果等
  2. 视觉效果优美:通过多层发光、脉冲效果和相位偏移,创造出逼真而华丽的涟漪效果
  3. 支持多颜色模式:可以实现单色涟漪或彩虹般的多色涟漪效果
  4. 易于扩展:基于Manim的Animation类,易于与其他动画效果结合

3.2. 使用场景

涟漪扩散特效在以下场景中特别有用:

  1. 数据可视化:用于突出显示数据点或数据变化
  2. 科学动画:模拟水面波纹、声波、电磁波等物理现象
  3. 教育视频:在解释概念时吸引观众注意力,提高学习效果
  4. 产品展示:为产品演示添加视觉亮点,增强吸引力
  5. 片头片尾:作为视频过渡或装饰元素
  6. 用户界面设计:在交互式应用中提供视觉反馈

通过本文介绍的RippleEffect类,你可以轻松在自己的动画项目中实现这一效果,为你的作品增添视觉吸引力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRMEB标准版PHP移动订单功能深度解析:多端同步方案

添加的客服进移动端个人中心统计管理里面就可以管理订单 Git仓库:https://gitee.com/ZhongBangKeJi/CRMEB

PolarFire SOC Auto Update 和 IAP 文档阅读(四) IAP

PolarFire SOC Auto Update 和 IAP 文档阅读(四) IAP 文档来自:PolarFire FPGA and PolarFire SoC FPGA Programming User GuidePolarFire SOC Auto Update 和 IAP 文档阅读一 - 所长 - 博客园 PolarFire SOC Auto Up…

CICD流程建设之持续测试实践指南

本文来自腾讯蓝鲸智云社区用户: CanWay持续测试(CT)是在软件开发周期(SDLC)期间持续检查软件质量的过程。具体指每次更改代码时定期执行的自动化测试。持续测试可及早发现并修复问题,确保软件始终准备就绪并运行良…

wordpress文章添加按钮seo检查工具

目录 项目名称: 项目背景: 项目目标: 项目成果: 经验教训及学习: 未来优化: 项目名称: 数字华容道小游戏 项目背景: 在学习编程过程中,为了加强特性技术和对概念…

Xcode 26.0.1 (17A400) 发布 - Apple 平台 IDE

Xcode 26.0.1 (17A400) 发布 - Apple 平台 IDEXcode 26.0.1 (17A400) 发布 - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接:https://sysin.org/blog/apple-xcode-26/ 查看最新版。原…

Tenable Nessus 10.10 (macOS, Linux, Windows) - 漏洞评估解决方案

Tenable Nessus 10.10 (macOS, Linux, Windows) - 漏洞评估解决方案Tenable Nessus 10.10 (macOS, Linux, Windows) - 漏洞评估解决方案 发布 Nessus 试用版自动化安装程序,支持 macOS Sequoia、RHEL 9、Ubuntu 24.04…

CNN+MNIST - 实践

CNN+MNIST - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Cou…

南昌做网站优化价格广州shopify代建站

:base(必须有值):作用是将父类的值继承过来,如果不在构造函数中加入:base(变量) 的话,原父类中的 Model则无法继承过来。 例如:在父类MSG_Model,有连个属性,如图 1.子类构造函数不写:base(参数) 2.1.子类构…

SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具

SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具 Self-managed static analysis…

HTTP协议工作原理与生产环境服务器搭建实战 - 详解

HTTP协议工作原理与生产环境服务器搭建实战 - 详解2025-09-25 14:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

网站建设课程简介枣庄手机网站建设公司

超精密光学3D测量仪器具有高精度、自动化程度高、实时反馈和范围广等优势。它能够实现微米级别的精确测量,能够精确测量产品的尺寸、形状和表面粗糙度等,具有广泛的应用价值和重要意义。 超精密光学3D测量仪器配备多种传感器、控制器和计算机系统&#…

超快轻量级离线翻译服务器MTranServer在腾讯云轻量应用服务器上的全流程部署指南 - 实践

超快轻量级离线翻译服务器MTranServer在腾讯云轻量应用服务器上的全流程部署指南 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

微算法科技(NASDAQ: MLGO)利用高级 Blowfish 加密标准实现区块链集成信息共享

在当今数字化时代,信息的安全与高效共享愈发重要。区块链技术的兴起为分布式数据存储与共享提供了可靠的架构,但数据安全始终是核心关注点。微算法科技(NASDAQ: MLGO)敏锐洞察到此需求,鉴于传统加密方式存在一定局…

专业讲解大模型登记(纯干货)

专业讲解大模型登记(纯干货)一、为什么要做大模型上线登记? 对通过API接口或其他方式直接调用已备案大模型能力,且面向境内公众提供具有舆论属性或者社会动员能力的生成式人工智能服务开展登记工作。 二、 我应该做…

Spring / Spring Boot 常用注解 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:【Cesium 开发实战教程】第六篇:三维模型高级交互:点击查询、材质修改与动画控制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

中国做网站的公司有哪些优化的网站做域名跳转

引子?最近,忽然想起曾在 WebGL 基础系列 文章中立下 flag:“后续还打算出 《ThreeJS 源码剖析》 系列”(特意翻出原话?),项目忙了一阵后,便决定开始写此系列,更新周期不固定,毕竟项目排期“天晓得”。此系…

转载 - Heterogeneous Memory Management (HMM) - (待翻译)

转载 - Heterogeneous Memory Management (HMM) - (待翻译)Heterogeneous Memory Management (HMM) Provide infrastructure and helpers to integrate non-conventional memory (device memory like GPU on board me…

Docker常用命令速查

一、镜像相关命令命令 说明docker build -t <镜像名>:<标签> . 根据 Dockerfile 构建镜像docker images 或 docker image ls 查看本地镜像列表docker rmi <镜像ID或名字> 删除本地镜像docker pull &…

MX 练石 2025 NOIP #9

, Rank .继续怒砍 25pts!2025 --【炼石计划 NOIP】-- 第九套 链接: 题解: 时间:4.5h (2025.09.25 07:40~12:10) 题目数:4 难度:估分:20 + 0 + 5 + ? = 25 + ? 得分: Rank:场祭 读题。 草咋这么难。 A,推了…