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)