manim边做边学--图形的创建与烧毁

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

上一篇介绍了文字相关的创建和烧毁动画,本篇介绍几个用于几何图形的创建和烧毁动画结果类。

  • Create:用于在场景中生成一个完整的Mobject(可渲染对象)
  • Uncreate:是Create的逆操作,用于将已经存在于场景中的Mobject从场景中移除
  • DrawBorderThenFill:用于分两步展示一个图形对象
  • ShowIncreasingSubsets:用于展示一个包含多个子对象的父对象中的子集逐步增长的过程
  • ShowSubmobjectsOneByOne:专注于逐个表现一个复杂对象中的子对象
  • SpiralIn:使对象以螺旋式的路径进入场景
1. 动画函数概要

上面的几个动画函数基本都是创建元素用的,用于烧毁元素的只有Uncreate函数。
1.1. Create

Create动画结果的焦点作用是将一个Mobject在场景中瞬间生成并表现出来。
它就像是一个开关,从不可见状态切换到可见状态,用于在场景中引入新的元素,如几何图形、文本对象等。
它的主要参数有:
参数名称类型说明mobjectVMobject要创建的动画对象lag_ratiofloat用于控制动画中对象出现的延迟比例introducerbool指定一个用于引入或引导动画对象的动画结果introducer参数不常用,它的详细用法和结果大概因版本而异。
1.2. Uncreate

与Create相反,Uncreate的主要作用是将场景中已经存在的Mobject从可见状态转换为不可见状态,实现对象的移除结果。
它的主要参数有:
参数名称类型说明mobjectVMobject要烧毁的动画对象1.3. DrawBorderThenFill

DrawBorderThenFill适用于绘制有填充结果的图形。
比如在展示一个复杂的多边形大概自界说形状时,先绘制表面可以让观众清楚地看到图形的边界,然后再填充图形中间的部分。
它的主要参数有:
参数名称类型说明mobjectVMobject要创建的动画对象run_timefloat动画的持续时间rate_funcfunc动画的速率函数draw_border_animation_configdict绘制边框的动画配置fill_animation_configdict填充内部的动画配置1.4. ShowIncreasingSubsets

ShowIncreasingSubsets可以按照一定的顺序(通常是根据对象在聚会合的顺序)逐个大概逐组地表现对象,具有很好的条理感和递进感,能够引导观众逐步明白整体对象是怎样由各个部分组成的。
它的主要参数有:
参数名称类型说明groupVMobject要创建的动画对象(一般由多个子对象组成)1.5. ShowSubmobjectsOneByOne

ShowSubmobjectsOneByOne类似于ShowIncreasingSubsets,但更侧重于逐个表现一个复杂对象中的子对象。
比如在展示一个分层的图形结构(如多层嵌套的几何图形)大概一个具有多个组成部分的动画脚色时,逐个表现子对象可以详细地展示其内部结构。
它的主要参数有:
参数名称类型说明groupVMobject要创建的动画对象(一般由多个子对象组成)1.6. SpiralIn

SpiralIn以其独特的螺旋式进入方式来吸引观众的留意力,使对象的出现更具动态感和空间感。
这种动画结果可以让场景看起来更加生动和富有创意。
它的主要参数有:
参数名称类型说明shapesVMobject要创建的动画对象scale_factorfloat控制对象沿螺旋路径进入场景时的缩放比例fade_in_fractionfloat控制对象在沿螺旋路径进入场景时的淡入结果2. 使用示例

下面还是通过示例来演示各种动画结果及其主要参数。
2.1. Create和Uncreate

这个示例通过设置速率函数演示元素的创建和烧毁方式,示例中有3种速率,分别为匀速,逐渐变慢(按照时间的平方根来渲染)和逐渐变快(按照时间的平方来渲染)。
  1. s1 = Square(color=BLUE)
  2. s2 = Square(color=GREEN)
  3. s3 = Square(color=YELLOW)
  4. VGroup(s1, s2, s3).scale(0.8).arrange(RIGHT, buff=0.5)
  5. self.play(
  6.     Create(s1, rate_func=lambda x: x),
  7.     Create(s2, rate_func=lambda x: np.sqrt(x)),
  8.     Create(s3, rate_func=lambda x: x**2),
  9.     run_time=2,
  10. )
  11. self.wait()
  12. self.play(
  13.     Uncreate(s3, rate_func=lambda x: x),
  14.     Uncreate(s2, rate_func=lambda x: np.sqrt(x)),
  15.     Uncreate(s1, rate_func=lambda x: x**2),
  16.     run_time=2,
  17. )
复制代码

2.2. DrawBorderThenFill

DrawBorderThenFill动画的特点是先渲染边框,再填充内部,这个示例通过绘制一个简朴的儿童画,来演示其特点。
  1. t = Triangle(fill_opacity=1, fill_color=BLUE_D)
  2. s = Square(side_length=1.5, fill_opacity=1, fill_color=ORANGE)
  3. r = Rectangle(height=1, width=0.5, fill_opacity=1, fill_color=PURPLE)
  4. c1 = Circle()
  5. c2 = Circle()
  6. c3 = Circle()
  7. self.play(DrawBorderThenFill(t), run_time=run_time)
  8. self.play(DrawBorderThenFill(s), run_time=run_time)
  9. self.play(DrawBorderThenFill(r), run_time=run_time)
  10. self.play(
  11.     DrawBorderThenFill(c1),
  12.     DrawBorderThenFill(c2),
  13.     DrawBorderThenFill(c3),
  14.     run_time=run_time,
  15. )
复制代码

2.3. ShowIncreasingSubsets和ShowSubmobjectsOneByOne

这个示例演示ShowIncreasingSubsets和ShowSubmobjectsOneByOne的区别,
ShowIncreasingSubsets是逐步渲染一个个子对象,已经渲染的子对象会保留下来;
而ShowSubmobjectsOneByOne虽然也是逐步渲染一个个子对象,但是渲染下一个子对象时,会清理上一个子对象。
以是,使用ShowSubmobjectsOneByOne时,始终只有一个子对象被表现出来。
  1. # 创建一个由多个小正方形组成的大正方形
  2. squares = VGroup()
  3. colors = [BLUE, GREEN, YELLOW]
  4. for x in range(3):
  5.     for y in range(3):
  6.         square = Square(
  7.             side_length=0.5,
  8.             stroke_width=1,
  9.             stroke_color=RED,
  10.             fill_opacity=0.5,
  11.             fill_color=colors[y],
  12.         ).shift(x * 0.5 * RIGHT + y * 0.5 * UP)
  13.         squares.add(square)
  14. vg = VGroup(squares, squares.copy())
  15. vg.arrange(RIGHT, buff=1)
  16. # 使用ShowIncreasingSubsets动画展示
  17. # 使用ShowSubmobjectsOneByOne动画展示
  18. self.play(
  19.     ShowIncreasingSubsets(vg[0]),
  20.     ShowSubmobjectsOneByOne(vg[1]),
  21.     run_time=3,
  22. )
复制代码

2.4. SpiralIn

这个示例演示了SpiralIn函数通过旋转方式创建元素的方式,第一次的2个图形以默认的参数旋转进场;
第二次的3个图形则以更小的旋转半径(通过scale_factor参数)旋转进场。
  1. c = Circle(color=GREEN_C, fill_opacity=1).shift(LEFT)
  2. s = Square(color=BLUE_D, fill_opacity=1).shift(UP)
  3. shapes = VGroup(c, s)
  4. self.play(SpiralIn(shapes))
  5. self.wait()
  6. self.remove(shapes)
  7. t = Triangle(color=RED_D, fill_opacity=1)
  8. shapes = VGroup(c, s, t)
  9. self.play(SpiralIn(shapes, scale_factor=0.5))
复制代码

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(graph.py),
下载地址: 完整代码 (访问密码: 6872)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表