manim边做边学--文字的创建与销毁
本篇开始介绍Manim中的动画模块,动画模块是整个框架的核心魅力所在。
Manim不仅提供了可以直接实现各种各样动画效果的对象,
还提供了设置动画的时长、延迟时间以及运动速率等参数,可以据此发挥自己的创意,自定义出与众不同的动画效果。
本篇主要介绍与文字相关的几个内置的动画效果。
AddTextLetterByLetter:以逐个字母添加文本的方式来展示文字内容RemoveTextLetterByLetter:类似橡皮擦式的文本删除效果Write:模拟手写的效果Unwrite:与Write动画相反,用于模拟擦除手写内容或者撤销绘制的过程
1. 动画概述
1.1. AddTextLetterByLetter
AddTextLetterByLetter动画的特点是以逐个字母添加文本的方式来展示文字内容,呈现出一种文字逐步生成的效果。
呈现的过程中可以控制字母出现的速度,让动画的节奏更符合内容需要。
它主要适用于教学视频、讲解类动画等场景。
例如在制作数学定理讲解视频时,逐步展示定理内容,让观众能够逐字跟上节奏,增强理解。
它的主要参数有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| text | Text | 要逐个显示字母的文本内容 |
| time_per_char | float | 字母出现的频率,用于控制每个字母出现的时间间隔 |
| rate_func | func | 用于控制字母出现的速率函数 |
| run_time | float | 动画的运行时间 |
1.2. RemoveTextLetterByLetter
RemoveTextLetterByLetter实现文本从后往前逐个字母消失的效果,
和 AddTextLetterByLetter 相反,有一种反向的动态感。
它能够和其他动画效果配合,例如在文字逐个删除后,紧接着出现新的文本,形成连贯的内容更新动画。
RemoveTextLetterByLetter一般用于橡皮擦式的文本删除效果,在需要撤销输入或者擦除内容的场景下使用。
比如在展示代码编辑过程中,对错误代码进行逐个字母删除的动画。
它的主要参数有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| text | Text | 要逐个删除字母的文本内容 |
| time_per_char | float | 控制每个字母删除的时间间隔,即字母逐个消失的频率 |
| rate_func | func | 用于控制字母删除的速率函数 |
| run_time | float | 动画的运行时间 |
1.3. Write
Write动画从对象的起始点开始,以一种类似手写或者绘制的方式来展示对象的出现,给人一种自然生成的感觉。
不仅是文字,对于复杂的图形,也可以根据图形的结构和路径进行书写式的动画展示,而不是简单的整体出现。
因为其模拟手写的效果,Write非常适合在数学推导、绘图步骤或者艺术创作过程的展示中使用。
例如,在展示几何图形的绘制步骤时,也可以用 Write 动画来模拟手动画图的过程。
它的主要参数有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| vmobject | VMobject | 要进行手写动画的对象 |
| rate_func | func | 用于控制书写的速率函数 |
| reverse | bool | 用于控制书写方向是否反向 |
1.4. Unwrite
Unwrite动画与 Write 动画相反,用于模拟擦除手写内容或者撤销绘制的过程。
它以一种类似于逆向书写的方式来使对象消失,和 Write 动画形成互补的效果。
在教学视频中,如果需要重新讲解某个步骤,可以用 Unwrite 动画来清除之前的内容。
它的主要参数有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| vmobject | VMobject | 要进行擦除的对象 |
| rate_func | func | 用于控制擦除的速率函数 |
| reverse | bool | 用于控制擦除的顺序(从前往后擦,还是从后往前擦) |
2. 使用示例
下面还是结合一些根据实际场景简化的示例来演示文字创建和销毁相关动画的使用。
2.1. 模拟知识讲解的视频
在这个模拟知识讲解视频的示例中,先通过AddTextLetterByLetter引入问题,引起观众的思考。
然后用Write动画展示答案推导过程,帮助观众理解。
之后使用RemoveTextLetterByLetter删除问题,避免画面过于杂乱,
最后用Unwrite擦除答案,为下一个知识点的讲解做准备。
# 首先使用 AddTextLetterByLetter 逐个字母显示问题
question = Text("什么是勾股定理?")
question.shift(UP * 2)
self.play(AddTextLetterByLetter(question))
self.wait()
# 接着使用 Write 动画来展示答案的逐步推导过程
answer = MathTex(r"a^2 + b^2 = c^2", font_size=40)
answer.next_to(question, DOWN)
self.play(Write(answer), run_time=run_time)
self.wait()
# 然后使用 RemoveTextLetterByLetter 逐个字母删除问题
self.play(RemoveTextLetterByLetter(question))
self.wait()
# 最后使用 Unwrite 动画擦除答案
self.play(Unwrite(answer))

2.2. 模拟故事创作动画
此示例应用于故事创作动画中,AddTextLetterByLetter让故事标题逐个字母出现,增加神秘感。
Write动画呈现故事开头,使观众沉浸在故事氛围中。
随后RemoveTextLetterByLetter和Unwrite分别删除故事开头和标题,象征着故事一个段落的结束,为后续情节发展腾出画面空间。
其中RemoveTextLetterByLetter设置了reverse参数为False,这样删除字母的顺序变成了从头到尾。
# 用 AddTextLetterByLetter 显示故事标题
title = Text("The Mysterious Forest", color=YELLOW)
title.shift(UP * 2)
self.play(AddTextLetterByLetter(title))
self.wait()
# 使用 Write 动画展示故事的开头描述
story = Text(
"Once upon a time, \nthere was a young adventurer \nwho entered the forest.",
font_size=30,
)
story.next_to(title, DOWN)
self.play(Write(story))
self.wait()
# 用 RemoveTextLetterByLetter 逐个字母删除故事开头
self.play(RemoveTextLetterByLetter(story))
self.wait()
# 使用 Unwrite 动画擦除标题
self.play(Unwrite(title, reverse=False))

2.3. 不用速率显示文本
在这个示例中,主要演示rate_func参数的使用。
分别使用3种不同的速率来显示文本,第一行文本的显示速率是时间的平方根,所以会逐渐变慢;
第二行文本的显示速率是线性的,所以文本逐个匀速显示出来;
第二行文本的显示速率是时间的平方,所以显示速度越来越快。
这样就展示了在manim中如何利用rate_func参数来实现不同速率的文本显示动画效果。
# 准备要显示的文本
txt1 = Text("Slow speed for display text", font_size=30, color=BLUE)
txt2 = Text("Normal speed for display text", font_size=30, color=RED)
txt3 = Text("Fast speed for display text", font_size=30, color=GREEN)
txt1.shift(UP * 2)
# 设置不同的 rate_func 来控制文本出现速率
# 越来越慢的速率,t 的平方根函数
self.play(AddTextLetterByLetter(txt1, rate_func=lambda t: t**0.5))
self.wait()
txt2.next_to(txt1, DOWN)
# 使用线性速率函数快速显示文本
self.play(AddTextLetterByLetter(txt2, rate_func=linear))
self.wait()
txt3.next_to(txt2, DOWN)
# 越来越快的速率,t 的平方函数
self.play(AddTextLetterByLetter(txt3, rate_func=lambda t: t**2))
self.wait()
# 清除场景中的文本
self.play(Unwrite(txt1), Unwrite(txt2), Unwrite(txt3))

3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(text.py),
下载地址: 完整代码 (访问密码: 6872)
manim边做边学--文字的创建与销毁的更多相关文章
- 边做边学入门微信小程序之仿豆瓣评分
微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...
- Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain
近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...
- 和我一起学Effective Java之创建和销毁对象
前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- [Effective Java]第二章 创建和销毁对象
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- effective java读书小记(一)创建和销毁对象
序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...
- Android线程的创建与销毁
摘要: 在Android开发中经常会使用到线程,一想到线程,很多同学就立即使用new Thread(){...}.start()这样的方式.这样如果在一个Activity中多次调用上面的代码,那么将创 ...
- 《Effective Java》读书笔记(一)之创建和销毁对象
最近在研读<Effective Java>一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记. 郑重声明: 由于是<Effective Java>一书的 ...
- 【转】VC 模式对话框和非模式对话框的创建,销毁和区别
原文网址:http://blog.csdn.net/mycaibo/article/details/6002151 VC 模式对话框和非模式对话框的创建,销毁和区别 在WIN32中,模式对话框的创 ...
- QWidget一生,从创建到销毁事件流
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QWidget一生,从创建到销毁事件流 本文地址:http://techieliang ...
随机推荐
- Angular 18+ 高级教程 – NgModule
前言 NgModule 在 Angular v14 以前是一门必修课.然而,自 Angular v14 推出 Standalone Component 以后,它的地位变得越来越边缘化了. 本教程从开篇 ...
- 单片机-XIP-外部闪存就地执行代码
声明:此博文所述我未实践,目的是知识整理. 1. 常说的 "单片机的norflash上可以执行代码 " 这句话该如何理解? CPU做取指.译码.执行. 常说的哪些介质可以执行程序 ...
- C语言位域的内存布局
本文将先粗略介绍大小端,和大小端的测试方法,最后介绍位域的内存布局. 1. 大小端 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中. 小端模式,是指数据的高字节保存 ...
- 《HelloGitHub》第 102 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...
- `->` 操作符重载的注意事项
在 C++ 中,-> 操作符可以被重载,用于对象的指针成员访问. 重载后的 -> 操作符主要用于模拟指针访问行为,常见于智能指针的实现等复杂场景. -> 操作符重载后的调用触发流程: ...
- 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2024年7月刊
本文为大家整理了墨天轮数据社区2024年7月发布的优质技术文章/文档,主题涵盖Oracle.MySQL.PostgreSQL等主流数据库系统以及国产数据库的深度教程和实用指南.从基础的安装配置到复杂的 ...
- 2022年3月中国数据库排行榜:TiDB “三连降”仍霸榜首,“常胜四将军”得分集体下跌
春暖花开好时光,三月一号迎榜来.2022年3月的 中国数据库流行度排行榜 已在墨天轮社区发布,本月共有 199个 数据库参与排名,相比上月新增四个数据库.排名前十的数据库得分均有所波动,整体排名变动略 ...
- 优质技术文章分享 | 首届【MogDB数据库征文活动】进行中,期待您的参与
2022年6月30日,MogDB 3.0版本正式发布,基于2.1版本进一步增强,集成了openGauss 3.0.0版本的新增特性,并融合了云和恩墨的创新特性研发,持续助力用户达成安稳易用的企业级数据 ...
- 墨天轮最受DBA欢迎的数据库技术文档-监控篇
好久不见,<墨天轮最受欢迎的技术文档>系列文章回归啦!本期主题数据库监控篇,希望能够帮助到大家!此外,为感谢大家支持,原文文末也给大家带来了返场福利,欢迎大家进入原文参与~ 数据库监控是许 ...
- kotlin类与对象——>委托、委托属性
1.委托 1.1 委托的实现 委托模式已经证明是实现继承的一个很好的替代方式,而 Kotlin 可以零样板代码地原生支持它. Derived 类可以通过将其所有公有成员都委托给指定对象来实现一个接口 ...