- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
本篇开始介绍Manim中的动画模块,动画模块是整个框架的核心魅力所在.
Manim不仅提供了可以直接实现各种各样动画效果的对象, 。
还提供了设置动画的时长、延迟时间以及运动速率等参数,可以据此发挥自己的创意,自定义出与众不同的动画效果.
本篇主要介绍与文字相关的几个内置的动画效果.
AddTextLetterByLetter
:以逐个字母添加文本的方式来展示文字内容RemoveTextLetterByLetter
:类似橡皮擦式的文本删除效果Write
:模拟手写的效果Unwrite
:与 Write
动画相反,用于模拟擦除手写内容或者撤销绘制的过程AddTextLetterByLetter动画的特点是以逐个字母添加文本的方式来展示文字内容,呈现出一种文字逐步生成的效果.
呈现的过程中可以控制字母出现的速度,让动画的节奏更符合内容需要.
它主要适用于教学视频、讲解类动画等场景.
例如在制作数学定理讲解视频时,逐步展示定理内容,让观众能够逐字跟上节奏,增强理解.
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
text | Text | 要逐个显示字母的文本内容 |
time_per_char | float | 字母出现的频率,用于控制每个字母出现的时间间隔 |
rate_func | func | 用于控制字母出现的速率函数 |
run_time | float | 动画的运行时间 |
RemoveTextLetterByLetter实现文本从后往前逐个字母消失的效果, 。
和 AddTextLetterByLetter 相反,有一种反向的动态感.
它能够和其他动画效果配合,例如在文字逐个删除后,紧接着出现新的文本,形成连贯的内容更新动画.
RemoveTextLetterByLetter一般用于橡皮擦式的文本删除效果,在需要撤销输入或者擦除内容的场景下使用.
比如在展示代码编辑过程中,对错误代码进行逐个字母删除的动画.
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
text | Text | 要逐个删除字母的文本内容 |
time_per_char | float | 控制每个字母删除的时间间隔,即字母逐个消失的频率 |
rate_func | func | 用于控制字母删除的速率函数 |
run_time | float | 动画的运行时间 |
Write动画从对象的起始点开始,以一种类似手写或者绘制的方式来展示对象的出现,给人一种自然生成的感觉.
不仅是文字,对于复杂的图形,也可以根据图形的结构和路径进行书写式的动画展示,而不是简单的整体出现.
因为其模拟手写的效果,Write非常适合在数学推导、绘图步骤或者艺术创作过程的展示中使用.
例如,在展示几何图形的绘制步骤时,也可以用 Write 动画来模拟手动画图的过程.
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
vmobject | VMobject | 要进行手写动画的对象 |
rate_func | func | 用于控制书写的速率函数 |
reverse | bool | 用于控制书写方向是否反向 |
Unwrite动画与 Write 动画相反,用于模拟擦除手写内容或者撤销绘制的过程.
它以一种类似于逆向书写的方式来使对象消失,和 Write 动画形成互补的效果.
在教学视频中,如果需要重新讲解某个步骤,可以用 Unwrite 动画来清除之前的内容.
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
vmobject | VMobject | 要进行擦除的对象 |
rate_func | func | 用于控制擦除的速率函数 |
reverse | bool | 用于控制擦除的顺序(从前往后擦,还是从后往前擦) |
下面还是结合一些根据实际场景简化的示例来演示文字创建和销毁相关动画的使用.
在这个模拟知识讲解视频的示例中,先通过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))
此示例应用于故事创作动画中,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))
在这个示例中,主要演示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))
文中的代码只是关键部分的截取,完整的代码共享在网盘中(text.py), 。
下载地址: 完整代码 (访问密码: 6872) 。
最后此篇关于manim边做边学--文字的创建与销毁的文章就讲到这里了,如果你想了解更多关于manim边做边学--文字的创建与销毁的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我发现当文本超过 20 行时,此动画需要花费大量时间来渲染。我可以做些什么来加快速度吗? import itertools as it class FormulaExample(Scene): d
请您向我解释一下什么是 VGroup 以及它有什么用处?我试图寻找它,但显然无济于事,没有太多的文档。提前致谢。 最佳答案 基本上是一组VMobjects .所以说你有一些方程由多个单独的 Texmo
你能画对角线/箭头/任何看起来像你在manim数学方程中抵消的东西吗? 最佳答案 最接近的定义是 Cross ,但这并不完全是您要找的,我喜欢用这个: class Cancel(VGroup):
希望你们一切都好! 我想知道如何在 manim 中缩小文本。 我知道你可以做 text.scale(0.8),但我想知道使用后如何做。 例如, text.scale(0.8) self.play(Wr
希望你们一切都好! 我想知道如何在 manim 中缩小文本。 我知道你可以做 text.scale(0.8),但我想知道使用后如何做。 例如, text.scale(0.8) self.play(Wr
ORIGIN 中有一个正方形位置,我想将它移动到 UP*3 并使用以下代码片段同时缩放到 0.5: sq = Square() self.add(sq) self.play(ApplyMethod(s
我在 Manim Community v0.16.0.post0 中有以下文本: dioscuri = Text("DIOSCURI", weight=BOLD, font="Arial", colo
有什么办法可以增加动画中特定线条的宽度? 我试图改变DEFAULT_STROKE_WIDTH在 constants.py并设置 stroke_width在 CONFIG等于某个数字,但它不起作用。 这
txt11 = TexMobject(r"-7", color=BLACK) txt12 = TexMobject(r"\frac{1}{7}", color=BLACK).next_to(txt11
txt11 = TexMobject(r"-7", color=BLACK) txt12 = TexMobject(r"\frac{1}{7}", color=BLACK).next_to(txt11
我想用不同颜色绘制 MathTex 元素的变量,但 Manim 似乎对复杂的 Latex 表达式有问题。 这是我的场景。 from manim import * config.frame_width
this is the thing I wanted to make 我是 manim 的新手,我正在尝试将文本放在一个矩形内,如图中所示我怎样才能做到这一点 ?? :( 最佳答案 您可以使用 VGr
我主要尝试运行两个动画(引用以下代码): class RelTrain(Scene): def construct(self): train = Rectangle(heigh
无论如何,我正在尝试(这实际上是我的第一个 manim 程序)。 from manim import * import copy import numpy as np import random co
我开始学习 manim,希望你能帮助我理解这段代码是如何工作的 class Line_1(Scene): def construct(self): path = Line(LE
我是马尼姆新手。 与下面的示例一样, class scene_example(Scene): def construct(self): txt1 = Text("Text1")
我是马尼姆新手。 与下面的示例一样, class scene_example(Scene): def construct(self): txt1 = Text("Text1")
最初的问题发布在 Reddit (https://www.reddit.com/r/manim/comments/lw3xs7/is_it_possible_to_run_manim_programm
有没有办法使用 manim 显示 latex 表并为其设置动画? 例如 \begin{table}[] \centering \begin{tabular}{lllll} & & \multico
如果我有 3 行 manim 文本, l = TextMobject("Line 1") l2 = TextMobject("Line 2") l3 = TextMobject("Line 3")
我是一名优秀的程序员,十分优秀!