news 2026/4/3 5:18:31

Manim实现波浪形文字特效

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Manim实现波浪形文字特效

本文将介绍如何使用Manim实现波浪形文字特效,通过自定义动画类让文字产生波浪般的动态效果。

1. 实现原理

波浪形文字特效的核心是通过自定义Animation类,对文本对象中的每个字符应用不同的位置偏移,从而形成波浪效果。

下面我们来分析具体实现:

1.1. 自定义Animation类

class WaveText(Animation):

"""波浪形文字特效动画类"""

def __init__(

self, text_mobject, amplitude=0.2, frequency=2, phase=0, direction=UP, **kwargs

):

# 保存参数

self.amplitude = amplitude

self.frequency = frequency

self.phase = phase

self.direction = direction

# 获取文本对象中的所有子对象(每个字符)

self.chars = text_mobject.submobjects

# 记录每个字符的原始位置

self.original_positions = [char.get_center() for char in self.chars]

super().__init__(text_mobject, **kwargs)

在WaveText类的初始化方法中,我们做了以下几件事:

保存动画参数:振幅(amplitude)、频率(frequency)、初始相位(phase)和波动方向(direction)

获取文本对象中的所有子对象(每个字符)

记录每个字符的原始位置,以便后续计算偏移量

调用父类的初始化方法

1.2. 实现interpolate_mobject方法

def interpolate_mobject(self, alpha):

"""在动画过程中更新文本对象"""

# 计算当前时间相位

current_phase = self.phase + alpha * TAU * self.frequency

# 更新每个字符的位置

for i, char in enumerate(self.chars):

# 获取字符原始位置

original_pos = self.original_positions[i]

# 计算波浪偏移量

char_phase = 3 * original_pos[0]

offset = self.amplitude * np.sin(char_phase + current_phase)

# 计算新位置

new_pos = original_pos + offset * self.direction

# 更新字符位置

char.move_to(new_pos)

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

alpha参数表示动画进度,范围从0到1

计算当前时间的相位,结合alpha和frequency参数控制波浪的周期

对每个字符应用不同的位置偏移,偏移量使用正弦函数计算

字符的x坐标用于创建不同的相位,使每个字符有不同的波动

最后,将计算得到的新位置应用到每个字符上

2. 使用示例

代码中提供了三个不同的场景示例,展示了波浪文字特效的各种用法:

2.1. 完整示例

class Example01(Scene):

"""波浪文字特效完整示例场景"""

def construct(self):

# 创建多个文本对象,展示不同参数的效果

text1 = Text("Hello Manim!", font_size=40).shift(UP * 2)

text2 = Text("Large Amplitude", font_size=40).shift(UP * 0.5)

text3 = Text("High Frequency", font_size=40).shift(DOWN * 0.5)

text4 = Text("Horizontal Wave", font_size=40).shift(DOWN * 2)

# 为每个文本创建不同参数的波浪动画

wave_anim1 = WaveText(

text1, amplitude=0.3, frequency=2, run_time=3, rate_func=linear

)

wave_anim2 = WaveText(

text2, amplitude=0.5, frequency=1, run_time=3, rate_func=linear

)

wave_anim3 = WaveText(

text3, amplitude=0.1, frequency=5, run_time=3, rate_func=linear

)

wave_anim4 = WaveText(

text4, amplitude=0.3, frequency=3, direction=RIGHT, run_time=3, rate_func=linear

)

# 显示所有文本并同时播放动画

self.play(FadeIn(text1), FadeIn(text2), FadeIn(text3), FadeIn(text4))

self.play(wave_anim1, wave_anim2, wave_anim3, wave_anim4)

self.wait()

这个示例展示了如何同时应用不同参数的波浪效果到多个文本对象上,包括不同的振幅、频率和方向。

2.2. 中文文本示例

class Example02(Scene):

"""中文波浪文字特效简单示例场景"""

def construct(self):

# 创建中文文本

text = Text("数学动画框架", font_size=60)

# 显示文本并应用波浪动画

self.play(Write(text))

self.wait()

# 应用垂直波浪效果

wave_animation = WaveText(

text, amplitude=0.2, frequency=2, run_time=2, rate_func=linear

)

self.play(wave_animation)

self.wait()

# 应用水平波浪效果

wave_animation2 = WaveText(

text, amplitude=0.4, frequency=1, direction=RIGHT, run_time=2, rate_func=linear

)

self.play(wave_animation2)

self.wait()

这个示例展示了波浪特效在中文文本上的应用,先应用垂直方向的波浪,然后应用水平方向的波浪。

2.3. 数学公式示例

class Example03(Scene):

"""数学公式文字特效简单示例场景"""

def construct(self):

# 创建数学公式文本

text = MathTex("E", "=", "m", "c", "^2", font_size=60)

# 显示公式并应用波浪动画

self.play(Write(text))

self.wait()

# 应用垂直波浪效果

wave_animation = WaveText(

text, amplitude=0.2, frequency=2, run_time=2, rate_func=linear

)

self.play(wave_animation)

self.wait()

# 应用水平波浪效果

wave_animation2 = WaveText(

text, amplitude=0.4, frequency=1, direction=RIGHT, run_time=2, rate_func=linear

)

self.play(wave_animation2)

self.wait()

这个示例展示了波浪特效在数学公式(使用MathTex创建)上的应用,同样分别应用了垂直和水平方向的波浪效果。

注意:这里数学公式中的每个元素要分开写,也就是:MathTex("E", "=", "m", "c", "^2")。

如果写成一个整体的话(MathTex("E=mc^2")),整个公式会作为一个整体上下或左右摆动,不会有波浪效果。

3. 总结

3.1. 波浪文字特效的特点

高度可定制:通过调整振幅、频率、相位和方向等参数,可以创建各种不同风格的波浪效果

适用范围广:支持普通文本、中文字符和数学公式等多种文本类型

实现简洁:通过继承Animation类并重写interpolate_mobject方法,实现了核心的波浪效果

易于扩展:可以结合Manim的其他功能,如颜色变化、缩放等,创建更复杂的动画效果

3.2. 使用场景

视频片头/片尾:为标题或字幕添加波浪效果,增加视觉吸引力

教学视频:在讲解波浪、波动方程等概念时,可以用波浪文字特效直观地展示

数据可视化:为关键数据标签添加动态效果,突出重要信息

创意动画:结合其他动画效果,创建独特的视觉艺术作品

波浪文字特效是Manim中一个简单但非常实用的动画技巧,通过本文的介绍,相信你已经掌握了其实现原理和使用方法。

不妨动手尝试,为你的Manim动画增添更多动感和魅力!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 11:33:50

无锡黑锋 HF3608V 35V热插拔、45V耐压、固定限流保护开关技术解析

一、芯片核心定位HF3608V 是一款采用 SOT23-3 封装、集成固定阈值保护功能的 高压前端保护开关IC 其核心价值在于 高达45V的输入瞬态耐压、35V的热插拔耐受能力 以及 内置的 1.3A 固定过流保护 专为对成本敏感且需要基础保护的便携设备充电端口设计,如智能手机、蓝牙…

作者头像 李华
网站建设 2026/3/16 22:26:49

无锡黑锋 HF3601 15V热插拔、20V耐压、集成防反接的紧凑型保护开关技术解析

一、芯片核心定位HF3601 是一款采用 SOT23-3 封装,并额外集成了 输入防反接保护 功能的 高压前端保护开关IC 其核心价值在于 高达20V的输入耐压、15V的热插拔能力、1.3A固定过流保护 以及 关键的防电源反接能力 专为成本敏感、空间受限且需要防止电源极性接错的便携…

作者头像 李华
网站建设 2026/4/3 2:53:32

无锡黑锋 HF2211 40V热插拔、50V耐压、多GND增强型固定限流保护开关技术解析

一、芯片核心定位HF2211 是一款采用 SOT23-6L 封装、通过 四个GND引脚增强散热与接地性能 的 高压前端保护开关IC 其核心价值在于 高达50V的输入瞬态耐压、40V的“无电容”热插拔耐受能力、较低的220mΩ导通电阻 以及 2.0A的固定过流保护 专为对热性能和接地阻抗有一定要求的中…

作者头像 李华
网站建设 2026/4/2 12:38:05

基于Spring Boot的实验室设备管理系统

基于Spring Boot的实验室设备管理系统的介绍 一、系统背景与目标 实验室设备管理是高校、科研机构及企业研发部门的核心工作之一。传统设备管理依赖人工记录和纸质文档,存在信息滞后、设备利用率低、维护不及时等问题。本系统基于Spring Boot框架与Java技术栈开发&a…

作者头像 李华
网站建设 2026/3/30 5:26:47

一个纯净的自动微分框架—autograd

技术背景自动微分是一个在深度学习等计算领域非常常用的一个工具了,其核心原理就是基于链式法则的求导。但是如果只是为了使用一个自动微分的功能,不做深度学习的话,去安装一个庞大的深度学习框架,学习成本是很高的,尤…

作者头像 李华
网站建设 2026/4/3 1:32:11

考研调剂经验分享

个人简介一志愿西南交通大学,专业代码120100,总分366分(数学三88分,英语一77分,政治70分,运筹学131分)。选择了三所调剂院校,被浙江理工大学拒绝,我拒绝了北京信息科技大…

作者头像 李华