本文将介绍如何使用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类采用了以下核心设计:

  1. 波纹数据结构:使用Annulus(圆环)作为基本波纹单元,通过self.ripples列表存储多个波纹对象
  2. 颜色处理:支持单一颜色或渐变色列表,自动处理颜色不足时的循环使用
  3. 场景集成:提供可选的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)

这里的关键技术点包括:

  1. 相位偏移:通过为每个波纹分配不同的相位偏移,创造出波纹依次扩散的视觉效果
  2. 正弦函数插值:使用正弦函数控制透明度变化,实现更自然的淡出效果
  3. 动态更新:在每一帧都创建新的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. 使用步骤详解

  1. 准备工作:首先导入必要的库
from manim import *
import numpy as np
  1. 创建中心点:水波纹效果需要一个中心点作为扩散起点
center_point = ORIGIN
center_dot = Dot(center_point, color=BLUE, radius=0.1)
self.play(FadeIn(center_dot))
  1. 定义颜色方案:可以使用渐变色列表增强视觉效果
gradient_colors = [BLUE, TEAL, GREEN, YELLOW, RED]
  1. 应用水波纹动画:配置各项参数并播放动画

    • 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. 特效特点

  1. 视觉效果丰富:支持单一颜色和渐变色,可创建多种视觉风格
  2. 高度可定制:提供多个参数调整波纹数量、大小、速度和颜色
  3. 实现简洁:基于Manim的Animation类扩展,代码结构清晰易懂
  4. 资源管理完善:包含清理机制,避免场景对象堆积

3.2. 使用场景

水波纹特效在以下场景中特别适用:

  1. 几何演示:用于展示圆的概念、扩散过程等几何知识
  2. 受力分析:模拟波的传播,展示力学中的波动现象
  3. 交互反馈:作为点击或其他交互操作的视觉反馈
  4. 强调重点:用于强调画面中的特定元素或区域
  5. 过渡效果:作为场景切换或元素出现/消失的过渡动画

通过这个简单但功能强大的水波纹特效,可以为你的数学动画增添更多视觉吸引力和专业感。无论是教学演示、科学解释还是艺术创作,都能发挥重要作用。

Manim实现水波纹特效的更多相关文章

  1. Android水波纹特效的简单实现

    我的开源页面指示器框架 MagicIndicator,各位一定不要错过哦. 水波纹特效,想必大家或多或少见过,在我的印象中,大致有如下几种: 支付宝 "咻咻咻" 式 流量球 &qu ...

  2. WebGL——水波纹特效

    大家好,今天我ccentry要做一个水波纹特效,我们来看看水波纹特效的做法.首先我们来看一下水波纹特效的效果是怎么样的,请看下图. 我们要做的就是类似这种纹理特效,那么我们来看看是如何制作的吧.首先鲫 ...

  3. 2.CCGridAction(3D效果),3D反转特效,凸透镜特效,液体特效,3D翻页特效,水波纹特效,3D晃动的特效,扭曲旋转特效,波动特效,3D波动特效

     1 类图组织 2 实例 CCSprite * spr = CCSprite::create("HelloWorld.png"); spr->setPosition(cc ...

  4. CSS 按钮水波纹特效

    /* 按钮反馈之波纹 */ .ripple { position: relative; /* overflow:hidden */  打开注释及效果不扩散在外 } .ripple:focus{ out ...

  5. Android5.0以上的项目都会有的按钮点击特效--水波纹

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  6. android 5.0 水波纹 实现

    1. 定义一个普通圆角背景的xml; rounded_corners.xml <?xml version="1.0" encoding="utf-8"?& ...

  7. canvas实现水波纹效果

    本文将会从水波的基本原理开始,详细讲解在canvas中模拟水波扩散,分析并计算水波的能量分布,并通过振幅模拟水波对图像的折射效果,最后实现水波特效. 水波基本原理 首先复习一波高中物理知识. 波是指振 ...

  8. Android特效专辑(十一)——仿水波纹流量球进度条控制器,实现高端大气的主流特效

    Android特效专辑(十一)--仿水波纹流球进度条控制器,实现高端大气的主流特效 今天看到一个效果挺不错的,就模仿了下来,加上了一些自己想要的效果,感觉还不错的样子,所以就分享出来了,话不多说,上图 ...

  9. Android特效专辑(十)——点击水波纹效果实现,逻辑清晰实现简单

    Android特效专辑(十)--点击水波纹效果实现,逻辑清晰实现简单 这次做的东西呢,和上篇有点类似,就是用比较简单的逻辑思路去实现一些比较好玩的特效,最近也是比较忙,所以博客更新的速度还得看时间去推 ...

  10. Android特效专辑(一)——水波纹过渡特效(首页)

    Android特效专辑(一)--水波纹过渡特效(首页) 也是今天看到的一个特效,感觉挺漂亮的,最近也一直在筹划一个APP,就想把他当做APP的首页,然后加些处理,关于首页APP的特效等我完工了再贴出来 ...

随机推荐

  1. JQ原生 Ajax请求

    现在的前端请求.真的是百花齐放,但是老古董ajax 还是挺好用的,主要是简单的 $.ajax({                    type: "Post",          ...

  2. SQL Server 部分数据库问题。 sp_configure 值 'contained database authentication' 必须设置为 1 才能 创建 包含的数据库

    人总是会下意思地逃避去做自己不喜欢的事情,导致这类事情越积越多. 最后,记忆这些不喜欢的事情所产生的负担,远远超出了完成它们所花费的痛苦 sp_configure 值 'contained datab ...

  3. java基础--List

    List基本属性和方法移步官方文档: List (Java Platform SE 8 ) 1.处理最简单的List<String>: (1)并集.交集.差集 并集: 如果只用List.a ...

  4. cordova使用http协议打开页面(cordova结合qiankunJs)

    起因 cordova的webview默认使用file协议打开页面 qiankunJs无法(基于fetch)使用file协议加载子应用 Cookie也无法在file协议下使用 双击页面以file协议打开 ...

  5. windows使用chrome调试ios webView

    包含safari和App如果安装失败,直接删除C:\Users\Administrator\scoop 重新安装即可 安装scoop windows下的安装源搜索工具,有点类似centos下的yum. ...

  6. 前端开发系列014-基础篇之Javascript面向对象(三)

    一.原型对象相关方法 ❏ in 关键字 ❏ instanceof ❏ hasOwnProperty方法 ❏ constructor构造器属性 ❏ isProtoTypeOf方法 in关键字 作用 用来 ...

  7. ThreadPoolExecutor 中为什么WorkQueue会在corePoolSize满了之后入队

    简介 看别人的博客, 不清楚为什么会入队. code public void execute(Runnable command) { if (command == null) throw new Nu ...

  8. vscode 回退

    简介 配置 Go Back / Go Forward 个人必须配置这两个否则会十分不爽.

  9. 面试官:如何实现企业级MCP分布式部署?

    作为一个企业级的 MCP Server 服务,只运行在单机环境上是远远不够的,我们需要让它部署在多个机器上,并且支持分布式的调用,这其中当然还包括负载均衡和节点变更的动态感知等内容. 那么如何让你的 ...

  10. POLIR-Society-Organization-Psychology-Emotions情绪 : The 6 Types of Basic Emotions and Their Effect on Human Behavior

    EMOTIONS > The 6 Types of Basic Emotions and Their Effect on Human Behavior By Kendra Cherry, MSE ...