manim边做边学--图形的创建与销毁
上一篇介绍了文字相关的创建和销毁动画,本篇介绍几个用于几何图形的创建和销毁动画效果类。
Create
:用于在场景中生成一个完整的Mobject
(可渲染对象)Uncreate
:是Create
的逆操作,用于将已经存在于场景中的Mobject
从场景中移除DrawBorderThenFill
:用于分两步展示一个图形对象ShowIncreasingSubsets
:用于展示一个包含多个子对象的父对象中的子集逐步增加的过程ShowSubmobjectsOneByOne
:专注于逐个显示一个复杂对象中的子对象SpiralIn
:使对象以螺旋式的路径进入场景
1. 动画函数概要
上面的几个动画函数基本都是创建元素用的,用于销毁元素的只有Uncreate
函数。
1.1. Create
Create
动画效果的核心作用是将一个Mobject
在场景中瞬间生成并显示出来。
它就像是一个开关,从不可见状态切换到可见状态,用于在场景中引入新的元素,如几何图形、文本对象等。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
mobject | VMobject | 要创建的动画对象 |
lag_ratio | float | 用于控制动画中对象出现的延迟比例 |
introducer | bool | 指定一个用于引入或引导动画对象的动画效果 |
introducer
参数不常用,它的具体用法和效果可能因版本而异。
1.2. Uncreate
与Create
相反,Uncreate
的主要作用是将场景中已经存在的Mobject
从可见状态转换为不可见状态,实现对象的移除效果。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
mobject | VMobject | 要销毁的动画对象 |
1.3. DrawBorderThenFill
DrawBorderThenFill
适用于绘制有填充效果的图形。
比如在展示一个复杂的多边形或者自定义形状时,先绘制轮廓可以让观众清楚地看到图形的边界,然后再填充图形中间的部分。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
mobject | VMobject | 要创建的动画对象 |
run_time | float | 动画的持续时间 |
rate_func | func | 动画的速率函数 |
draw_border_animation_config | dict | 绘制边框的动画配置 |
fill_animation_config | dict | 填充内部的动画配置 |
1.4. ShowIncreasingSubsets
ShowIncreasingSubsets
可以按照一定的顺序(通常是根据对象在集合中的顺序)逐个或者逐组地显示对象,具有很好的层次感和递进感,能够引导观众逐步理解整体对象是如何由各个部分组成的。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
group | VMobject | 要创建的动画对象(一般由多个子对象组成) |
1.5. ShowSubmobjectsOneByOne
ShowSubmobjectsOneByOne
类似于ShowIncreasingSubsets
,但更侧重于逐个显示一个复杂对象中的子对象。
比如在展示一个分层的图形结构(如多层嵌套的几何图形)或者一个具有多个组成部分的动画角色时,逐个显示子对象可以详细地展示其内部结构。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
group | VMobject | 要创建的动画对象(一般由多个子对象组成) |
1.6. SpiralIn
SpiralIn
以其独特的螺旋式进入方式来吸引观众的注意力,使对象的出现更具动态感和空间感。
这种动画效果可以让场景看起来更加生动和富有创意。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
shapes | VMobject | 要创建的动画对象 |
scale_factor | float | 控制对象沿螺旋路径进入场景时的缩放比例 |
fade_in_fraction | float | 控制对象在沿螺旋路径进入场景时的淡入效果 |
2. 使用示例
下面还是通过示例来演示各种动画效果及其主要参数。
2.1. Create和Uncreate
这个示例通过设置速率函数演示元素的创建和销毁方式,示例中有3种速度,分别为匀速,逐渐变慢(按照时间的平方根来渲染)和逐渐变快(按照时间的平方来渲染)。
s1 = Square(color=BLUE)
s2 = Square(color=GREEN)
s3 = Square(color=YELLOW)
VGroup(s1, s2, s3).scale(0.8).arrange(RIGHT, buff=0.5)
self.play(
Create(s1, rate_func=lambda x: x),
Create(s2, rate_func=lambda x: np.sqrt(x)),
Create(s3, rate_func=lambda x: x**2),
run_time=2,
)
self.wait()
self.play(
Uncreate(s3, rate_func=lambda x: x),
Uncreate(s2, rate_func=lambda x: np.sqrt(x)),
Uncreate(s1, rate_func=lambda x: x**2),
run_time=2,
)
2.2. DrawBorderThenFill
DrawBorderThenFill
动画的特点是先渲染边框,再填充内部,这个示例通过绘制一个简单的儿童画,来演示其特点。
t = Triangle(fill_opacity=1, fill_color=BLUE_D)
s = Square(side_length=1.5, fill_opacity=1, fill_color=ORANGE)
r = Rectangle(height=1, width=0.5, fill_opacity=1, fill_color=PURPLE)
c1 = Circle()
c2 = Circle()
c3 = Circle()
self.play(DrawBorderThenFill(t), run_time=run_time)
self.play(DrawBorderThenFill(s), run_time=run_time)
self.play(DrawBorderThenFill(r), run_time=run_time)
self.play(
DrawBorderThenFill(c1),
DrawBorderThenFill(c2),
DrawBorderThenFill(c3),
run_time=run_time,
)
2.3. ShowIncreasingSubsets和ShowSubmobjectsOneByOne
这个示例演示ShowIncreasingSubsets
和ShowSubmobjectsOneByOne
的区别,
ShowIncreasingSubsets
是逐步渲染一个个子对象,已经渲染的子对象会保留下来;
而ShowSubmobjectsOneByOne
虽然也是逐步渲染一个个子对象,但是渲染下一个子对象时,会清理上一个子对象。
所以,使用ShowSubmobjectsOneByOne
时,始终只有一个子对象被显示出来。
# 创建一个由多个小正方形组成的大正方形
squares = VGroup()
colors = [BLUE, GREEN, YELLOW]
for x in range(3):
for y in range(3):
square = Square(
side_length=0.5,
stroke_width=1,
stroke_color=RED,
fill_opacity=0.5,
fill_color=colors[y],
).shift(x * 0.5 * RIGHT + y * 0.5 * UP)
squares.add(square)
vg = VGroup(squares, squares.copy())
vg.arrange(RIGHT, buff=1)
# 使用ShowIncreasingSubsets动画展示
# 使用ShowSubmobjectsOneByOne动画展示
self.play(
ShowIncreasingSubsets(vg[0]),
ShowSubmobjectsOneByOne(vg[1]),
run_time=3,
)
2.4. SpiralIn
这个示例演示了SpiralIn
函数通过旋转方式创建元素的方式,第一次的2个图形以默认的参数旋转进场;
第二次的3个图形则以更小的旋转半径(通过scale_factor
参数)旋转进场。
c = Circle(color=GREEN_C, fill_opacity=1).shift(LEFT)
s = Square(color=BLUE_D, fill_opacity=1).shift(UP)
shapes = VGroup(c, s)
self.play(SpiralIn(shapes))
self.wait()
self.remove(shapes)
t = Triangle(color=RED_D, fill_opacity=1)
shapes = VGroup(c, s, t)
self.play(SpiralIn(shapes, scale_factor=0.5))
3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(graph.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 ...
随机推荐
- BOM – Window.matchMedia
参考 Youtube – Detecting Screen Size and OS Dark Mode with matchMedia() - JavaScript Tutorial 介绍 CSS 有 ...
- C++ STL(标准模版库)—— vector 与 迭代器
STL 基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称. STL 从广义上讲分为三类:algorithm(算法).containe ...
- 【ARMv8基础篇】CCI-400控制器简介
CCI(Cache Coherent Interconnect)是ARM中的cache一致性控制器. CCI-400将互连和一致性功能结合到一个模块中.它支持多达两个ACE 主节点的连接,例如: Co ...
- Java实用小工具系列2---使用StopWatch统计多个任务耗时分布
在Java中经常需要统计程序的使用时间,如果只是一个时间段统计比较好处理,可以直接使用System.currentTimeMillis().但如果一个程序中包含多个步骤,需要统计每个步骤耗时,并且需要 ...
- 数据库周刊57丨Oracle 2021年度安全警报;MySQL 8.0.23发布;MySQL索引优化导致的死锁案例;巨杉数据库跨引擎事务实践;MongoDB企业级能力解析;OceanBase OBCP 实验指导手册……
摘要:墨天轮数据库周刊第57期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档. 热门资讯 1.Oracle 2021年度安全警报: Critical Patch Update 发布8个 ...
- Data Summit 2022 大会资料分享(共23个)
Data Summit (数据峰会)是国际上关于数据管理.分析方面最新战略和技术研讨的顶尖峰会,通过行业领先的企业.专家的分享,共同探讨大数据和数据科学领域的发展现状与最新技术研究. 2022年5月1 ...
- 牛逼!5K star! 推荐一款集监控和埋点于一体的前端性能监控工具!开源、简单易用、功能强大!
在互联网的快速发展下,网站已成为企业和个人展示信息.提供服务的重要平台.然而,随之而来的网站性能问题也日益凸显,如加载速度慢.频繁出错.服务器故障.数据异常.网络攻击等.如何确保用户能够快速稳定地访问 ...
- 手撸二叉树——AVL平衡二叉树
还记得上一篇中我们遗留的问题吗?我们再简要回顾一下,现在有一颗空的二叉查找树,我们分别插入1,2,3,4,5,五个节点,那么得到的树是什么样子呢?这个不难想象,二叉树如下: 树的高度是4,并且数据结构 ...
- 快速理解和使用stream流
数据量越大,硬件内核数越多,stream流相比传统for循环速度越快. 原因是stream流是可以并行处理的. 如果要使用stream流,可以直接用flatmap把外层嵌套扁平化,只留下自己需要处理的 ...
- 一文彻底弄清Redis的布隆过滤器
布隆过滤器(Bloom Filter)是一种空间效率极高的数据结构,用于快速判断一个元素是否在集合中.它能够节省大量内存,但它有一个特点:可能存在误判,即可能会认为某个元素存在于集合中,但实际上不存在 ...