Manim实现波浪形文字特效

news/2025/9/30 12:33:02/文章来源:https://www.cnblogs.com/wang_yb/p/19120754

本文将介绍如何使用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 = amplitudeself.frequency = frequencyself.phase = phaseself.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动画增添更多动感和魅力!

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

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

相关文章

网站开发电子书网站ip地址 转向域名

内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强化PY学习,我决定…

JUC: synchronized与锁升级

4.10.1 面试题谈谈你对synchronized的理解 synchronized的锁升级机制是什么? 偏向锁和轻量锁有什么区别?高并发时,同步调用应该去考量锁的性能损耗。能用无锁的数据结构,就不要用锁。能用锁块,就不要锁整个方法体…

cron表达式,每月1号凌晨3点执行和每周4凌晨3点半执行

cron表达式,每月1号凌晨3点执行和每周4凌晨3点半执行cron表达式,每月1号凌晨3点执行和每周4凌晨3点半执行 1.每月1号凌晨3点执行的Cron表达式为:0 0 3 1 * ? 每个月1号 凌晨3点   0 0 3 1 * ? 和 0 0 3 1 …

学python的第8天

学python的第8天字符编码 水导链接——字符编码 水导链接——Python2和3字符编码的区别 文件基本操作 从硬盘中读取数据、写入数据 水导链接——文件基本操作 绝对路径和相对路径 水导链接——绝对路径和相对路径 文件…

2025.9.30

坐火车回家

lang / philipino / feilvbin / taglog / tajialu

s菲语 翻译magandang tanghali 下午好end

C#/.NET/.NET Core技术前沿周刊 | 第 56 期(2025年9.22-9.28)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与…

漳州做网站建设的公司做网站 赚广告费

作为当下大语言模型的典型代表,ChatGPT对人类学习方式和教育发展所产生的变革效应已然引起了广泛关注。技术的快速发展在某种程度上正在“倒逼”教育领域开启更深层次的变革。在此背景下,教育从业者势必要学会准确识变、科学应变、主动求变、以变应变&am…

US$249 Autek IKEY820 New License for GM, Grand Cheokee and Dodge Durango Key Programming

Autek IKEY820 New License for GM, Grand Cheokee and Dodge Durango Key ProgrammingWith this license, Autek IKEY820 can support new car models as below:1. Added 2018 Buick LaCrosse Pincode and Key Progra…

Estun机器人数据断电保持问题解决方案

Estun机器人数据断电保持问题解决方案要数据断电保持: 1.变量必须为全局变量 2.用等号做赋值运算

天津港口海鲜之旅全攻略(2025最新版)

🦀 天津港口海鲜之旅全攻略(2025最新版) 天津不仅是工业重镇,更是海鲜爱好者的天堂!每年9月开海后,正是吃海鲜、出海捕鱼的黄金时节。以下是为你整理的天津港口海鲜之旅全攻略,涵盖出海码头、海鲜购买、美食推…

tomcat创建bat启动,结合任务计划实现自动重启tomcat服务 - 详解

tomcat创建bat启动,结合任务计划实现自动重启tomcat服务 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

如何从安卓手机恢复手机照相机消失的相机照片?(6个高效办法)

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

实用指南:【论文精读】Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector

实用指南:【论文精读】Few-Shot Object Detection with Attention-RPN and Multi-Relation Detectorpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bloc…

网站开发实战asp制作视频教程wordpress用户积分

类似问题答案我是自动化专业的学生,大一的时候有没有必要考计算机二级证书计算机二级 虽然不是很重要 但是考了也是有好处的 自动化的跟计算机联系非常大 二级证不怎么重要 但是C语言很重要 对于你们 希望你还是去考个二级作为学习建筑类专业的学生,如果考试计算机二…

Chromium V8类型混淆漏洞CVE-2025-10585安全分析

微软安全响应中心发布关于Chromium V8引擎类型混淆漏洞CVE-2025-10585的安全公告。该漏洞已被在野利用,基于Chromium的Microsoft Edge浏览器已通过更新修复此漏洞。本文详细介绍了漏洞影响范围和版本信息。CVE-2025-1…

US$47.5 B48 MSV90 ISN Reading via OBD Authorization for Yanhua Mini ACDP

MSV90 ISN Reading via OBD Authorization for Yanhua Mini ACDPYou are offering to pay for MSV90 authorization alone, to work with your Yanhua ACDP.If you buy both Yanhua DME B48 Integrated Interface Boar…

免费电商网站模板海尔商城网站建设维护

等差数列划分 思路: 经验题目要求 dp[i]表示:以 i 位置为结尾的所有子数组中有多少个等差数列 状态转移方程 对 dp[i] 位置,数列至少有三个元素,如果相邻三个为等差数列,dp[i] dp[i-1] 1; 如果相邻三个不为等差数…

可以做系统同步时间的网站广东网页制作二级考试题目

程序员并不是没有一点乐趣整天枯燥无味的游走在代码中的,在这里给大家提供了一个表白代码 功能描述: 1:能够计算任意两个时间的之间相隔的天数,2:在相隔天数下面输出心形并且心形里面还有英文我爱你字样。相信你已经迫…

Claude 4.5 刚刚发布,能连肝 30 多个小时,史上最卷 AI 诞生

Claude 4.5 刚刚发布,能连肝 30 多个小时,史上最卷 AI 诞生论卷编程,还得看 Claude。 就在刚刚,Anthropic 正式发布 Claude Sonnet 4.5。先说 Claude Sonnet 4.5 交出的成绩单,在考察真实编程水平的 SWE-bench Ve…