manim边学边做--渐变生长
本篇介绍Manim
中的渐变生长类的动画。
这类动画的特点是可以清晰地展示图形的生成过程、物体的运动变化,帮助我们更好地理解抽象概念和复杂结构。
渐变生长类的动画的主要有:
GrowArrow
:让箭头从起始点按设定路径(如直线或弧线)和速度动态生长GrowFromCenter
:使对象以自身中心为起点,向四周按指定比例和速度均匀扩展生长GrowFromEdge
:让对象从指定边缘开始,按照设定的速度和程度向内部或外部生长GrowFromPoint
:从一个点开始,按照自定义的生长函数和速度来使对象生长SpinInFromNothing
:结合旋转和渐显效果,使对象从无到有并伴随着旋转而出现
1. 动画概述
1.1. GrowArrow
GrowArrow
主要用于箭头(Arrow
)对象的动画效果,能够让箭头从无到有地生长出来,给人一种动态的引导视觉效果。
它的动画过程比较平滑,能够很好地控制箭头生长的速度和方向,主要用于展示矢量相关内容的动画。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
arrow | Arrow类型 | 进行动画的箭头对象 |
point_color | Color | 箭头在生长到完整大小之前的初始颜色 |
主要方法有:
名称 | 说明 |
---|---|
create_starting_mobject | 用于创建动画起始时的对象状态 |
1.2. GrowFromCenter
GrowFromCenter
以对象的中心为起点,向四周扩展生长。
这种生长方式给人一种对称、均匀的视觉感受,使得对象的出现更加自然和美观。
对于具有中心对称性的对象,能够很好地突出其对称性,它适合用于展现图形从中心构建过程的动画。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
mobject | Mobject | 要进行动画的对象 |
point_color | Color | 对象在生长到完整大小之前的初始颜色 |
1.3. GrowFromEdge
GrowFromEdge
以对象的边缘为起始点进行生长,能够很好地体现图形的边界扩展过程。
这种方式与GrowFromCenter
形成对比,更侧重于展示图形是如何从边界开始构建的。
它可以根据需要选择不同的边缘作为生长起始边,常用于突出图形边界扩展的效果。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
mobject | Mobject | 要进行动画的对象 |
edge | np.ndarray | 指定生长的起始边缘方向 |
point_color | Color | 对象在生长到完整大小之前的初始颜色 |
edge
参数可以使用预定义的方向常量(如DOWN
、RIGHT
、UR
等)来指定对象的边界框边缘方向,
从而确定从哪个边缘开始生长。
1.4. GrowFromPoint
GrowFromPoint
从指定的一个点开始生长,这个点可以是对象内部或外部的任意一点。
这种方式提供了高度的定制性,能够聚焦于对象在某个特定位置的生长过程。
它可以用于创建一些具有创意的动画效果,比如让多个对象从不同的点同时生长,形成一个复杂的场景。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
mobject | Mobject | 要进行动画的对象 |
point | np.ndarray | 指定对象生长的起始点 |
point_color | Color | 对象在生长到完整大小之前的初始颜色 |
主要方法有:
名称 | 说明 |
---|---|
create_starting_mobject | 创建动画起始时的对象状态 |
create_target | 创建动画的目标对象状态 |
1.5. SpinInFromNothing
SpinInFromNothing
结合了旋转和从无到有的出现效果。
对象在旋转的同时逐渐显现,给人一种从虚无中旋转诞生的感觉
可以控制旋转的角度、方向和速度,以及对象出现的速度,从而实现各种不同的入场效果。
它的主要参数有:
参数名称 | 类型 | 说明 |
---|---|---|
mobject | Mobject | 要进行动画的对象 |
angle | float | 指定对象在生长到完整大小之前旋转的角度 |
point_color | Color | 对象在生长到完整大小之前的初始颜色 |
angle
参数设置2 * PI
表示对象将完整旋转一周(360
度)后完全出现。
2. 使用示例
下面通过示例来演示各个生长类动画的使用。
2.1. GrowArrow 示例
在这个示例中,创建了三个不同方向的箭头。
对于每个箭头,使用GrowArrow
动画并设置不同的初始颜色(point_color
),为了能看出初始颜色,设置了箭头的最终颜色和初始颜色不一样。
# 创建不同方向的箭头
a1 = Arrow(LEFT * 2, RIGHT * 2, color=RED)
a2 = Arrow(UP * 2, DOWN * 2, color=BLUE)
a3 = Arrow(UR * 2, DL * 2, color=GREEN)
# 以不同颜色和路径弧度展示GrowArrow动画
self.play(
GrowArrow(a1, point_color=BLUE),
)
self.play(
GrowArrow(a2, point_color=GREEN),
)
self.play(
GrowArrow(a3, point_color=RED),
)
2.2. GrowFromCenter 示例
此示例创建了圆形、正方形和三角形。在GrowFromCenter
动画中,为每个图形设置不同的初始颜色(point_color
)。
# 创建不同形状的对象
circle = Circle()
square = Square(color=BLUE)
triangle = Triangle(color=YELLOW)
# 以不同缩放比例和中心点展示GrowFromCenter动画
self.play(
GrowFromCenter(circle, point_color=BLUE),
)
self.play(
GrowFromCenter(square, point_color=YELLOW),
)
self.play(
GrowFromCenter(triangle, point_color=RED),
)
2.3. GrowFromEdge 示例
在这个例子中,创建三个矩形。针对每个矩形的GrowFromEdge
动画,指定了不同的起始边缘(edge
)和不同的初始颜色(point_color
)。
通过不同的边缘生长,可以看到矩形从边缘开始生长的多样化效果。
# 创建多个矩形
r1 = Rectangle(color=BLUE).shift(UP)
r2 = Rectangle(color=RED)
r3 = Rectangle(color=YELLOW).shift(DOWN)
# 从不同边缘和以不同速度展示GrowFromEdge动画
self.play(
GrowFromEdge(r1, DOWN, point_color=BLUE),
)
self.play(
GrowFromEdge(r2, RIGHT, point_color=RED),
)
self.play(
GrowFromEdge(r3, UP, point_color=YELLOW),
)
2.4. GrowFromPoint 示例
该示例先创建了三个点,然后在通过不同的起始点和自定义生长函数,展示了GrowFromPoint
动画在灵活指定生长起始点和控制生长方式方面的强大功能。
# 创建一个点和多个正方形
p1 = Dot(point=LEFT * 2, color=BLUE)
p2 = Dot(point=UP * 2, color=RED)
p3 = Dot(point=RIGHT * 2 + DOWN * 2, color=YELLOW)
s1 = Square(color=BLUE).shift(LEFT * 2)
s2 = Square(color=RED)
s3 = Square(color=YELLOW).shift(RIGHT * 2)
self.add(p1, p2, p3)
self.play(
GrowFromPoint(s1, p1.get_center()),
)
self.play(
GrowFromPoint(s2, p2.get_center(),
grow_function=lambda t: t**2,
),
)
self.play(
GrowFromPoint(s3, p3.get_center()),
)
2.5. SpinInFromNothing 示例
这里创建了三个不同边数的多边形。
在SpinInFromNothing
动画中,为每个多边形设置了不同的旋转角度(angle
)和初始颜色(point_color
)。
通过不同的旋转角度和颜色设置,可以看到多边形从无到有并伴随着旋转和颜色变化的生长效果。
# 创建多个多边形
p1 = RegularPolygon(5).shift(LEFT * 2)
p2 = RegularPolygon(6, color=RED)
p3 = RegularPolygon(8, color=YELLOW).shift(RIGHT * 2)
# 以不同旋转角度和颜色展示SpinInFromNothing动画
self.play(
SpinInFromNothing(p1),
)
self.play(
SpinInFromNothing(p2, angle=np.pi),
)
self.play(
SpinInFromNothing(p3, angle=3 * np.pi / 2, point_color=PINK),
)
3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(grow.py
),
下载地址: 完整代码 (访问密码: 6872)
manim边学边做--渐变生长的更多相关文章
- 学EE做硬件找工作不如学CS做软件,为什么会这样?
学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...
- 牛腩学Kotlin做Android应用
牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...
- php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)
php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...
- html5-3 html5标签(热点地图如何实现)(边学边做)
html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl 自定义列表dt 自定义标题dd 自定义列表内容 2. ...
- 第一份开发工作,边学边做android
我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...
- 边学边做,简单的 GraphQL 实例
项目中有功能要调用 API,对方 API 用的是 GraphQL 实现,就简单学了下,感叹技术进步真快,Facebook 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...
- LabVIEW Actor Framwork (2)________ 边学边做server&client
回顾下初始需求: 现在要做一个类似聊天的demo,一个server端,若干个client端:首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给serv ...
- 牛腩学ASP.NET CORE做博客(视频)
牛腩学习ASP.NET CORE做的项目,边学边做. 目录: 01-dotnetcore网站部署到centos7系统上(时长 2:03:16) 02-前期准备及项目搭建 (时长:0:23:35) 03 ...
- 牛腩学用MUI做手机APP
斗鱼直播间直播学习撸码,最终目标是用MUI做一个手机APP(暂定android平台,攒钱买IPHONE 7SE!!!),直播内容含整个软件APP的制作过程(含后台接口的制作,放到自己买的阿里云服务器, ...
- 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good
作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...
随机推荐
- [TK] Rudolf and Subway ( CodeForces #933 div.3 - G )
形式化题意 给定一个带权无向图,求从 \(s\) 点到 \(e\) 点的路径上途径边权种类的最小值. 思路 题图 我们把边权种类相同的点连成的子图抽象成一个 "平台" ,从题目给我 ...
- Hadoop完全分布式搭建,基于乌班图系统
因为现在集成的工具很多,建议在接触这一块的过程中还是自己找几个主机,亲手搭一遍集群,更好的熟悉底层!本文只是搭建的过程没有理论!手搭集群时先将各节点网络.ssh配置好!然后在一台机子上操作配置文件,直 ...
- 【赵渝强老师】Kafka的消息持久化
1.Kafka消息持久性概述 Kakfa依赖文件系统来存储和缓存消息.对于硬盘的传统观念是硬盘总是很慢,基于文件系统的架构能否提供优异的性能?实际上硬盘的快慢完全取决于使用方式.同时 Kafka 基于 ...
- 对3D图像进行裁剪
在对医学图像进行深度学习的过程中,我们会遇到图片过大,导致train的过程中网络会瘫痪,所以我们会考虑到对图像进行分割.比如一张155x240x240的图像,我们可以将他分割成一系列128x128x1 ...
- iOS中修饰符常用小结
1.copy,是复制引用对象地址的深拷贝 a:当修饰不可变类型的属性时,如NSArray.NSDictionary.NSString,用copy,用copy为关键字的话,调用setter方法后.是对赋 ...
- kotlin更多语言结构——>反射
类引用 最基本的反射功能是获取 Kotlin 类的运行时引用.要获取对静态已知的 Kotlin 类的引用,可以使用 类字面值 语法 val c = MyClass::class 请注意,Kotlin ...
- 在 Kubernetes 中基于 StatefulSet 部署 MySQL(上)
大家好,我是老 Z! 本文实现了 MySQL 数据库在基于 KubeSphere 部署的 K8s 集群上的安装部署,部署方式采用了图形化这种形式.下一篇文章将会涉及 GitOps 的基础操作,部署过程 ...
- 安装gd库出错
最近手痒,就安装了一个centos 6.5玩玩. 由于新的centos的当前版本已经达到7.1. 而且最糟的是在本人不小心的时候在安装软件的时候, 确定里里面的更新系统命令,导致版本变为了6.9. 然 ...
- C++新版本特性
C++新特性 1.C++11 中的新特性 C++11 引入了许多新特性,包括自动类型推导.lambda 表达式.右值引用等.下面介绍其中的一些重要特性. 1.1 自动类型推导(Type Inferen ...
- 函数(C语言)
目录 1. 函数的概念 2. 库函数 2.1 标准库和头文件 2.2 库函数的使用方法 3. 自定义函数 3.1 函数的语法形式 3.2 函数的举例 4. 形参和实参 4.1 实参 4.2 形参 4. ...