本文将介绍如何使用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
  • 计算当前时间的相位,结合alphafrequency参数控制波浪的周期
  • 对每个字符应用不同的位置偏移,偏移量使用正弦函数计算
  • 字符的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. 波浪文字特效的特点

  1. 高度可定制:通过调整振幅、频率、相位和方向等参数,可以创建各种不同风格的波浪效果
  2. 适用范围广:支持普通文本、中文字符和数学公式等多种文本类型
  3. 实现简洁:通过继承Animation类并重写interpolate_mobject方法,实现了核心的波浪效果
  4. 易于扩展:可以结合Manim的其他功能,如颜色变化、缩放等,创建更复杂的动画效果

3.2. 使用场景

  1. 视频片头/片尾:为标题或字幕添加波浪效果,增加视觉吸引力
  2. 教学视频:在讲解波浪、波动方程等概念时,可以用波浪文字特效直观地展示
  3. 数据可视化:为关键数据标签添加动态效果,突出重要信息
  4. 创意动画:结合其他动画效果,创建独特的视觉艺术作品

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

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

Manim实现波浪形文字特效的更多相关文章

  1. HTML5火焰文字特效DEMO演示

    效果展示:http://hovertree.com/texiao/html5/26/ 效果图: 扫描二维码查看效果:

  2. 帮助你提高排版技巧的18个 PS 文字特效教程

    Photoshop 文字特效教程对于学习基础的和高级的排版思维有很大的帮助.在这篇文章中,你会发现一组最新发布的文字效果教程.这些高品质的 Photoshop 教程可以帮助你设计出惊人的2D,3D,木 ...

  3. HTML5火焰文字特效DEMO演示---转载

    只有google支持 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  4. Css文字特效之text-shadow特效

    今天总结一下文字特效text-shadow,如果用好它可以做出各种不一样的效果,下图是我做出的几种效果. 怎么样,看起来很不错吧,下面贴代码. /* css */ p{ width:300px; ma ...

  5. HTML5/CSS3(PrefixFree.js) 3D文字特效

    之前在园子里看到一个HTML5/CSS3的文字特效(这里),觉得挺好玩的所以小小的研究了下,不过发现代码都是针对webkit以及FF的所以IE跪了. Runjs 我将示例中的代码进行了精简,后来发现C ...

  6. 7款震撼人心的HTML5CSS3文字特效

    1.HTML5像素文字爆炸重组动画特效 今天我们要分享一款基于HTML5技术的文字像素爆炸重组动画特效,我们可以在输入框中指定任意文字,点击确定按钮后,就会将原先的文字爆炸散去,新的文字以像素点的形式 ...

  7. 7款震撼人心的HTML5文字特效

    1.CSS3五彩文字特效 文字带阴影效果 这是一款非常具有卡通形象的CSS3五彩文字特效,虽然没有迷人的动画效果,但是五彩缤纷的文字展现在屏幕上也是非常酷的,再加上每一个文字都有不同角度的阴影效果,加 ...

  8. 18款js和jquery文字特效代码分享

    18款js和jquery文字特效代码分享 jQCloud标签云插件_热门城市文字标签云代码 js 3d标签云特效关键词文字球状标签云代码 原生JS鼠标悬停文字球状放大显示效果代码 原生js文字动画圆形 ...

  9. 创意HTML5文字特效 类似翻页的效果

    原文:创意HTML5文字特效 类似翻页的效果 之前在网上看到一款比较有新意的HTML5文字特效,文字效果是当鼠标滑过是出现翻开折叠的效果,类似书本翻页.于是我兴致勃勃的点开源码看了一下,发现其实实现也 ...

  10. CSS3火焰文字特效制作教程

    原文:CSS3火焰文字特效制作教程 用一句很俗气的话概括这两天的情况就是:“最近很忙”,虽然手头上有不少很酷的HTML5和CSS3资源,但确实没时间将它们的实现过程写成教程分享给大家.今天刚完成了一个 ...

随机推荐

  1. idea创建spring通用项目

    创建spring基础项目 高清地址点此播放 springBoot: 3.2 java: v21 mybatis: v3.2.4.1 swagger: v3 初始化完成后,我们看看pom文件会发现 已经 ...

  2. Codeforces Round #673 (Div. 2) ABC 题解

    A. Copy-paste 题意:问在保持每个数都小于等于k的情况下,最多能执行多少步a[j] += a[i] ,其中(i,j)为任意不同下标. 思路:水题,排个序,用a[1]去加到别的值上,看每个数 ...

  3. CMD中文乱码之另解决方案

    参考链接 博客 MSDN 博客园大牛 如果以上博客没有成功我也没办法了. 根据第二个给出的解决方案:控制面板--> 区域 --> 管理 --> 更改系统区域设置 -->设为中文 ...

  4. ETLCloud+Doris组合:数据集成,更简单更高效

    在现代数据驱动的业务环境中,高效的数据集成与处理是企业成功的关键.随着数据量的快速增长和多样化需求的增加,传统的数据处理工具已经无法满足企业的需求.ETLCloud与Doris的组合为企业提供了一种简 ...

  5. ETL驱动企业集成转型与数据集成创新

    数据集成:企业数智化的核心 数据集成是这一资产发挥价值的关键步骤,它将分散在不同来源的数据汇集到统一的平台,实现数据的集中管理和深入分析.通过这一过程,企业能够打破信息孤岛,提升数据的准确性和可靠性, ...

  6. RestCloud ETL社区版序列号相关咨讯

  7. 美英科创文化商业对比:Stochastic•Random: 都有“随机”的意思但Random更通用而Stochastic是Academic学术研究专业用词

    对比: 美国US的人文科学发展与美国的Open开放.Diversity多元.Inclusiveness包容.Democracy民主.Science科学.Innovation创新.Policy政策.Go ...

  8. Rust:axum学习笔记(1) hello world

    axum是Rust生态的web框架新秀,虽然项目成立不久,但github上的star数已超2.8k,其底层依赖的是高性能的Tokio,Tokio这货就不多说了,借用知乎<深入浅出Rust异步编程 ...

  9. MySQL存储引擎:MyISAM和InnoDB的区别 -九五小庞

    InnoDB:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎.它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚.InnoDB的性能与自动崩溃恢复的特性,使得它在非 ...

  10. 进阶篇:3.1.1.4)DFM注塑-热熔

    本章目的:了解塑胶件热熔装配方式的设计要点. 1.热熔的概念和原理 热熔是塑胶件与塑胶件或与其他零件,如金属件.印制电路板等进行装配的一种方法.热熔的原理:在塑胶件上有称为热熔柱的局部凸起,在需装配的 ...