本篇开始先容Manim中的动画模块,动画模块是整个框架的核心魅力所在。
Manim不仅提供了可以直接实现各种各样动画结果的对象,
还提供了设置动画的时长、延迟时间以及运动速率等参数,可以据此发挥本身的创意,自定义出与众差别的动画结果。
本篇重要先容与笔墨相关的几个内置的动画结果。
- AddTextLetterByLetter:以逐个字母添加文本的方式来展示笔墨内容
- RemoveTextLetterByLetter:类似橡皮擦式的文本删除结果
- Write:模仿手写的结果
- Unwrite:与 Write 动画相反,用于模仿擦除手写内容或者撤销绘制的过程
1. 动画概述
1.1. AddTextLetterByLetter
AddTextLetterByLetter动画的特点是以逐个字母添加文本的方式来展示笔墨内容,呈现出一种笔墨渐渐生成的结果。
呈现的过程中可以控制字母出现的速度,让动画的节奏更符合内容需要。
它重要实用于讲授视频、讲解类动画等场景。
例如在制作数学定理讲解视频时,渐渐展示定理内容,让观众可以或许逐字跟上节奏,增强理解。
它的重要参数有:
参数名称范例说明textText要逐个显示字母的文本内容time_per_charfloat字母出现的频率,用于控制每个字母出现的时间隔断rate_funcfunc用于控制字母出现的速率函数run_timefloat动画的运行时间1.2. RemoveTextLetterByLetter
RemoveTextLetterByLetter实现文本从后往前逐个字母消失的结果,
和 AddTextLetterByLetter 相反,有一种反向的动态感。
它可以或许和其他动画结果配合,例如在笔墨逐个删除后,紧接着出现新的文本,形成连贯的内容更新动画。
RemoveTextLetterByLetter一般用于橡皮擦式的文本删除结果,在需要撤销输入或者擦除内容的场景下使用。
比如在展示代码编辑过程中,对错误代码举行逐个字母删除的动画。
它的重要参数有:
参数名称范例说明textText要逐个删除字母的文本内容time_per_charfloat控制每个字母删除的时间隔断,即字母逐个消失的频率rate_funcfunc用于控制字母删除的速率函数run_timefloat动画的运行时间1.3. Write
Write动画从对象的起始点开始,以一种类似手写或者绘制的方式来展示对象的出现,给人一种自然生成的感觉。
不仅是笔墨,对于复杂的图形,也可以根据图形的结构和路径举行书写式的动画展示,而不是简单的团体出现。
因为其模仿手写的结果,Write非常恰当在数学推导、绘图步骤或者艺术创作过程的展示中使用。
例如,在展示多少图形的绘制步骤时,也可以用 Write 动画来模仿手动画图的过程。
它的重要参数有:
参数名称范例说明vmobjectVMobject要举行手写动画的对象rate_funcfunc用于控制书写的速率函数reversebool用于控制书写方向是否反向1.4. Unwrite
Unwrite动画与 Write 动画相反,用于模仿擦除手写内容或者撤销绘制的过程。
它以一种类似于逆向书写的方式来使对象消失,和 Write 动画形成互补的结果。
在讲授视频中,如果需要重新讲解某个步骤,可以用 Unwrite 动画来清除之前的内容。
它的重要参数有:
参数名称范例说明vmobjectVMobject要举行擦除的对象rate_funcfunc用于控制擦除的速率函数reversebool用于控制擦除的顺序(从前往后擦,还是从后往前擦)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)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |