Manim实现水波纹特效
本文将介绍如何使用ManimCE框架实现一个水波纹特效,让你的数学动画更加生动有趣。
1. 实现原理
水波纹特效通过WaterRipple类实现,这是一个自定义的Animation子类。让我们从代码角度来分析其实现原理:
1.1. 核心数据结构
class WaterRipple(Animation):
def __init__(
self, mobject, scene=None, num_ripples=5, max_outer_radius=3,
min_inner_radius=1, run_time=2, wave_speed=1.0,
color=BLUE, fade_out=True, **kwargs
):
# 初始化参数设置
self.num_ripples = num_ripples
self.max_outer_radius = max_outer_radius
self.min_inner_radius = min_inner_radius
self.wave_speed = wave_speed
self.color = color
self.fade_out = fade_out
self.ripples = []
self.mobject = mobject
self.scene = scene
# 颜色处理逻辑
self.color_list = color if isinstance(color, list) else [color] * num_ripples
if len(self.color_list) < num_ripples:
self.color_list = self.color_list * (
num_ripples // len(self.color_list) + 1
)
self.color_list = self.color_list[:num_ripples]
# 创建波纹对象
for i in range(num_ripples):
c = Annulus(
inner_radius=0, outer_radius=0,
color=self.color_list[i], stroke_width=2, fill_opacity=0,
)
c.move_to(mobject.get_center())
self.ripples.append(c)
# 将波纹添加到场景
if self.scene is not None:
for ripple in self.ripples:
self.scene.add(ripple)
super().__init__(mobject, run_time=run_time, **kwargs)
从代码中可以看出,WaterRipple类采用了以下核心设计:
- 波纹数据结构:使用
Annulus(圆环)作为基本波纹单元,通过self.ripples列表存储多个波纹对象 - 颜色处理:支持单一颜色或渐变色列表,自动处理颜色不足时的循环使用
- 场景集成:提供可选的
scene参数,方便将波纹直接添加到场景中
1.2. 动画插值算法
动画的核心在于interpolate_mobject方法,它定义了动画如何随时间变化:
def interpolate_mobject(self, alpha: float) -> None:
# 计算每个波纹的半径和透明度
for i in range(self.num_ripples):
# 每个波纹有不同的相位偏移
phase_offset = i * (np.pi / self.num_ripples)
# 使用正弦函数计算半径和透明度,实现波动效果
time_progress = (alpha + phase_offset * 0.2) % 1
radius = self.max_outer_radius * time_progress
if self.fade_out:
# 透明度随半径增大而减小,使用正弦函数使淡出更自然
opacity = max(0, np.sin(time_progress * np.pi))
else:
opacity = 1
# 应用变换,使用对应的颜色
new_c = Annulus(
inner_radius=self.min_inner_radius,
outer_radius=radius,
color=self.color_list[i],
stroke_width=2,
fill_opacity=opacity,
)
new_c.move_to(self.mobject.get_center())
self.ripples[i].become(new_c)
这里的关键技术点包括:
- 相位偏移:通过为每个波纹分配不同的相位偏移,创造出波纹依次扩散的视觉效果
- 正弦函数插值:使用正弦函数控制透明度变化,实现更自然的淡出效果
- 动态更新:在每一帧都创建新的
Annulus对象并通过become()方法更新波纹的状态
1.3. 资源清理机制
动画结束后,需要清理创建的波纹对象:
def clean_up_from_scene(self, scene: Scene) -> None:
# 动画结束后清理波纹
for ripple in self.ripples:
if ripple in scene.mobjects:
scene.remove(ripple)
super().clean_up_from_scene(scene)
这个方法确保动画结束后不会在场景中留下多余的对象,保持场景的整洁。
2. 使用示例
下面通过一个完整的示例场景来展示如何使用水波纹特效:
2.1. 单个水波纹效果
# 示例场景:单个水波纹效果
class Example01(Scene):
def construct(self):
# 创建中心点
center_point = ORIGIN
center_dot = Dot(center_point, color=BLUE, radius=0.1)
self.play(FadeIn(center_dot))
self.wait()
# 应用水波纹动画,使用渐变色效果
# 创建颜色渐变列表,从蓝色到紫色再到红色
gradient_colors = [BLUE, TEAL, GREEN, YELLOW, RED]
self.play(
WaterRipple(
center_dot,
scene=self,
num_ripples=5,
max_outer_radius=2,
run_time=4,
wave_speed=1.2,
color=gradient_colors, # 使用渐变色列表
fade_out=True,
stroke_width=1,
)
)
self.wait(2)

2.2. 使用步骤详解
- 准备工作:首先导入必要的库
from manim import *
import numpy as np
- 创建中心点:水波纹效果需要一个中心点作为扩散起点
center_point = ORIGIN
center_dot = Dot(center_point, color=BLUE, radius=0.1)
self.play(FadeIn(center_dot))
- 定义颜色方案:可以使用渐变色列表增强视觉效果
gradient_colors = [BLUE, TEAL, GREEN, YELLOW, RED]
- 应用水波纹动画:配置各项参数并播放动画
center_dot:波纹中心点对象scene=self:当前场景引用num_ripples=5:波纹数量max_outer_radius=2:最大半径run_time=4:动画运行时间wave_speed=1.2:波纹传播速度color=gradient_colors:使用渐变色列表fade_out=True:启用淡出效果
2.3. 自定义参数调整
根据实际需求,可以调整以下关键参数以获得不同的视觉效果:
num_ripples:控制波纹数量,更多的波纹会使效果更密集max_outer_radius:控制波纹扩散范围min_inner_radius:控制波纹的最小内半径run_time:控制动画持续时间wave_speed:控制波纹传播速度color:可以是单一颜色或渐变色列表fade_out:是否启用淡出效果
3. 总结
3.1. 特效特点
- 视觉效果丰富:支持单一颜色和渐变色,可创建多种视觉风格
- 高度可定制:提供多个参数调整波纹数量、大小、速度和颜色
- 实现简洁:基于Manim的Animation类扩展,代码结构清晰易懂
- 资源管理完善:包含清理机制,避免场景对象堆积
3.2. 使用场景
水波纹特效在以下场景中特别适用:
- 几何演示:用于展示圆的概念、扩散过程等几何知识
- 受力分析:模拟波的传播,展示力学中的波动现象
- 交互反馈:作为点击或其他交互操作的视觉反馈
- 强调重点:用于强调画面中的特定元素或区域
- 过渡效果:作为场景切换或元素出现/消失的过渡动画
通过这个简单但功能强大的水波纹特效,可以为你的数学动画增添更多视觉吸引力和专业感。无论是教学演示、科学解释还是艺术创作,都能发挥重要作用。
Manim实现水波纹特效的更多相关文章
- Android水波纹特效的简单实现
我的开源页面指示器框架 MagicIndicator,各位一定不要错过哦. 水波纹特效,想必大家或多或少见过,在我的印象中,大致有如下几种: 支付宝 "咻咻咻" 式 流量球 &qu ...
- WebGL——水波纹特效
大家好,今天我ccentry要做一个水波纹特效,我们来看看水波纹特效的做法.首先我们来看一下水波纹特效的效果是怎么样的,请看下图. 我们要做的就是类似这种纹理特效,那么我们来看看是如何制作的吧.首先鲫 ...
- 2.CCGridAction(3D效果),3D反转特效,凸透镜特效,液体特效,3D翻页特效,水波纹特效,3D晃动的特效,扭曲旋转特效,波动特效,3D波动特效
1 类图组织 2 实例 CCSprite * spr = CCSprite::create("HelloWorld.png"); spr->setPosition(cc ...
- CSS 按钮水波纹特效
/* 按钮反馈之波纹 */ .ripple { position: relative; /* overflow:hidden */ 打开注释及效果不扩散在外 } .ripple:focus{ out ...
- Android5.0以上的项目都会有的按钮点击特效--水波纹
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...
- android 5.0 水波纹 实现
1. 定义一个普通圆角背景的xml; rounded_corners.xml <?xml version="1.0" encoding="utf-8"?& ...
- canvas实现水波纹效果
本文将会从水波的基本原理开始,详细讲解在canvas中模拟水波扩散,分析并计算水波的能量分布,并通过振幅模拟水波对图像的折射效果,最后实现水波特效. 水波基本原理 首先复习一波高中物理知识. 波是指振 ...
- Android特效专辑(十一)——仿水波纹流量球进度条控制器,实现高端大气的主流特效
Android特效专辑(十一)--仿水波纹流球进度条控制器,实现高端大气的主流特效 今天看到一个效果挺不错的,就模仿了下来,加上了一些自己想要的效果,感觉还不错的样子,所以就分享出来了,话不多说,上图 ...
- Android特效专辑(十)——点击水波纹效果实现,逻辑清晰实现简单
Android特效专辑(十)--点击水波纹效果实现,逻辑清晰实现简单 这次做的东西呢,和上篇有点类似,就是用比较简单的逻辑思路去实现一些比较好玩的特效,最近也是比较忙,所以博客更新的速度还得看时间去推 ...
- Android特效专辑(一)——水波纹过渡特效(首页)
Android特效专辑(一)--水波纹过渡特效(首页) 也是今天看到的一个特效,感觉挺漂亮的,最近也一直在筹划一个APP,就想把他当做APP的首页,然后加些处理,关于首页APP的特效等我完工了再贴出来 ...
随机推荐
- RestFul 标准Api
RestFul Api 规范(URL,HTTP,版本,状态码,返回值,请求条件等规范) get (select) :从服务器取出资源(一项或多项) post (Create) :在服务器新建一个资源 ...
- Golang基础笔记十之goroutine和channel
本文首发于公众号:Hunter后端 原文链接:Golang基础笔记十之goroutine和channel 这一篇介绍 Golang 里的 goroutine 和 channel 通道. 以下是本篇笔记 ...
- centos stream 9 安装 java
# 下载java并解压到任意目录,比如我这里是 /home/soft cd /home/soft wget https://download.oracle.com/java/24/latest/jdk ...
- 前端开发系列064-网络篇之FormData基本使用
FormData 简单介绍 FormData是Ajax 2.0-XMLHttpRequest Level 2 提供的一个接口对象,可以使用该对象来模拟和处理表单并方便的进行文件上传操作. consol ...
- Stack Overflow,彻底凉了!
大家好,我是鱼皮. 先问个问题,如果现在让你来解决一个 Bug,你会怎么获取解决方案呢? 我保守估计至少 80% 的朋友会选择直接问 AI,15% 的朋友会选择利用搜索引擎,而剩下 5% 会选择找人提 ...
- link and import
转载 http://www.divcss5.com/rumen/r431.shtml 1.link语法结构<link href="CSSurl路径" rel="s ...
- C++ 11 move
简介 简单来说, move 可以对于赋值操作带来更好的效率, 因为减少了临时变量的构建. 另外对于完美转发, 右值与左值的使用, 晕晕晕. 参考链接 https://blog.csdn.net/boo ...
- 日事清助力制造业IPD全生命周期管理:从开发流程到持续优化的跨部门协作实践
一.先聊聊IPD,它到底是什么 在竞争激烈的市场中,产品的快速.精准开发是企业致胜的关键.而为了确保新产品能够顺利从概念到落地,越来越多的企业采用集成产品开发(IPD, Integrated Prod ...
- PostgreSQL 数据库中 ETL 操作的实战技巧
在当今数字化时代,数据已成为企业最为宝贵的资产之一,而数据库则是存储与管理这些关键数据的核心.PostgreSQL 作为一款功能强大的开源关系型数据库,在众多领域都发挥着重要作用.今天,就让我们深入探 ...
- 4月18日“RestCloud ETL社区版”重磅推出
- -/ 新一代ETL数据集成平台 /-- 数据价值的挖掘应用为当今社会的数字化进程开辟出了一个新的发展方向,未来更多的企业将逐渐进行数字化转型,以便于参与到数据产业体系当中,从而获得更强的创新能力和 ...