manim边学边做--局部变换
本次介绍的两个用于变换的动画类:TransformMatchingShapes和TransformMatchingTex。
它们的主要特点是对一组对象或一段文本进行局部变换,适用于复杂的图形或者文本的变换场景。
其中:
TransformMatchingShapes:用于不同形状的 VMobject 间转换,能自动匹配相似形状并创建平滑过渡动画,也支持手动指定匹配方式,适用于图形拼接、拆分等场景TransformMatchingTex:专门处理 LaTeX 文本对象转换,可自动匹配相同文本片段进行动画过渡,支持分组匹配,且保留文本样式,常用于数学公式推导、文本替换场景
1. 动画概述
1.1. TransformMatchingShapes
TransformMatchingShapes 主要用于在两个包含多个不同形状(如圆形、正方形、三角形等)的 VMobject 之间进行动画转换。
当你想要将一组形状变换为另一组形状,并且希望相似的形状之间能够自然地过渡时,这个类就非常有用。
例如,在数学动画中,将一个由几个三角形组成的图案变换为一个由几个正方形组成的图案;
或者在展示图形的拼接和拆分过程中,将一个复杂图形拆分成多个简单图形,再重新组合成另一个复杂图形。
它的参数主要有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| mobject | Mobject | 动画起始的对象,也就是需要进行形状转换的初始对象 |
| target_mobject | Mobject | 动画结束的目标对象 |
| transform_mismatches | bool | 是否对不匹配的子对象进行转换 |
| fade_transform_mismatches | bool | 是否淡化不匹配子对象的转换效果 |
| key_map | dict | 自定义子对象的匹配规则 |
TransformMatchingShapes 会自动识别两个 VMobject 中相似的形状,并在这些相似形状之间创建动画过渡。
相似性通常基于形状的类型(如圆形、正方形)和相对大小。
transform_mismatches参数是控制是否对于没有自动匹配的对象也进行转换。
除了自动匹配,也可以通过key_map参数指定形状的匹配方式,这在自动匹配无法满足需求时非常有用。
例如,你可能希望将一个圆形匹配到一个椭圆形,或者将一个不规则形状匹配到另一个特定的不规则形状。
它的主要方法有:
| 名称 | 说明 |
|---|---|
| get_mobject_key | 用于获取与对象相关的关键信息 |
| get_mobject_parts | 用于获取对象的各个组成部分 |
1.2. TransformMatchingTex
TransformMatchingTex 专门用于处理 LaTeX 文本对象之间的动画转换。
在数学公式推导、文本替换等场景中非常有用。
例如,在讲解数学公式的推导过程时,将一个公式逐步变换为另一个公式;
或者在展示文本的替换过程中,将一个单词或短语替换为另一个单词或短语。
在转换过程中,TransformMatchingTex 会保留文本的样式(如字体、颜色、大小等),使得转换后的文本与原始文本具有一致的外观。
TransformMatchingTex 参数和方法和TransformMatchingShapes是一样的。
2. 使用示例
下面通过示例来演示如何使用这两个局部变换的动画类。
2.1. 自动形状转换
这个示例中,我们创建了一个包含圆形,正方形,星形和正八边形的 VGroup 作为起始形状,
另一个包含正八边形,星形,三角形和菱形的 VGroup 作为目标形状。
TransformMatchingShapes 会自动尝试匹配相似的形状并进行转换,这里由于形状类型不同,会进行相应的变形动画。
# 创建起始形状
start_shapes = VGroup(
Circle(color=BLUE),
Square(color=RED),
Star(color=GREEN),
RegularPolygon(n=8, color=YELLOW),
)
# 创建目标形状
end_shapes = VGroup(
RegularPolygon(n=8, color=YELLOW),
Star(color=GREEN),
Triangle(color=BLUE),
RegularPolygon(n=4, color=RED),
)
self.add(start_shapes)
self.wait()
# 使用 TransformMatchingShapes 进行转换
self.play(
TransformMatchingShapes(
start_shapes,
end_shapes,
transform_mismatches=True,
),
)

从动画可以看出,各种原始图形自动变换为跟自己最为接近的图形:
- 蓝色圆形自动匹配转换为黄色正八边形
- 红色正方形转换为红色的菱形
- 黄色正八边形转换为蓝色三角形
- 绿色的星形没变
2.2. 自定义形状转换
在这个示例中,我们除了创建起始和目标形状外,还定义了一个 key_map 字典来指定自定义的形状匹配规则。
这样,TransformMatchingShapes 会按照我们指定的规则进行形状转换。
# 创建起始形状
start_shapes = VGroup(
Circle(color=BLUE),
Square(color=RED),
Star(color=GREEN),
RegularPolygon(n=8, color=YELLOW),
)
# 创建目标形状
end_shapes = VGroup(
RegularPolygon(n=8, color=YELLOW),
Star(color=GREEN),
Triangle(color=BLUE),
Square(color=RED),
)
self.add(start_shapes)
self.wait()
# 自定义匹配规则
key_map = {
Circle: Triangle,
}
# 使用 TransformMatchingShapes 并指定自定义匹配规则
self.play(
TransformMatchingShapes(
start_shapes,
end_shapes,
key_map=key_map,
transform_mismatches=True,
),
)

从动画可以看出,根据key_map参数,蓝色圆形被转换为蓝色的三角形,
而上一节自动匹配时,蓝色圆形是自动匹配转换为黄色正八边形的。
2.3. 公式转换示例
这个示例中,我们使用MathTex创建一些公式,公式中用{{ }}对需要转换的对象进行分组。
TransformMatchingTex 会将分组的部分作为一个整体进行匹配和转换。
# 创建起始公式
f1 = (
VGroup(
MathTex("a", color=RED),
MathTex("b", color=GREEN),
MathTex("c", color=YELLOW),
)
.arrange(RIGHT, buff=1)
)
# 创建目标公式
f2 = MathTex("{{x}}^2", "+", "{{y}}^2", "=", "{{z}}^2")
f3 = MathTex("{{a}}^2", "+", "{{b}}^2", "=", "{{c}}^2")
self.add(f1, f2)
self.wait()
# 使用 TransformMatchingTex 进行转换
self.play(TransformMatchingTex(VGroup(f1, f2), f3))
f4 = MathTex("{{a}}^2", "=", "{{c}}^2", "-", "{{b}}^2")
self.play(TransformMatchingTex(f3, f4))
f5 = MathTex("{{b}}^2", "=", "{{c}}^2", "-", "{{a}}^2")
self.play(TransformMatchingTex(f4, f5))

3. 总结
文中的代码只是关键部分的截取,完整的代码共享在网盘中(matching.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 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...
- NGUI 做局部2d卷轴
网上找到的都是做整个背景的卷轴动画,通常是改变纹理位置或者背景图片的x坐标 没有提到在UI界面里某个部分做卷轴动画,找了很久,才发现NGUI的Panel里的Clipping属性可以裁剪Panel的大小 ...
- 使用vue来做局部刷新
我们都知道,vue的组件化是他最强大的核心所在,路由也是特别可爱的一部分,但是路由适合一些大型的组件,看url路径的时候会出现变化,但是有时候我们想要一些小的局部小刷新,这个时候就需要用到它的动态组件 ...
- LabVIEW Actor Framwork (2)________ 边学边做server&client
回顾下初始需求: 现在要做一个类似聊天的demo,一个server端,若干个client端:首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给serv ...
- STM32F103VET6 ADC采集64点做FFT变换
http://www.stmcu.org/module/forum/thread-598459-1-11.html http://bbs.21ic.com/icview-589756-1-1.html ...
随机推荐
- ubuntu系统安装wps后语言是英文的问题
如果安装ubuntu系统后,在里面安装wps的时候,发现都是英文,无法切换为中文,可以这样操作. 此时点击这里新建一个word空白文档 点击这里新建文档 点击这里显示语言 点击下面的 简体中文 再点击 ...
- php 异步并行
如果你有一批数据需要调用远程接口处理,而远程接口处理时间很长,比如需要1秒左右,那10条数据就是10秒,你的程序就要10S才能结束,而这样的话一旦接口提供方有点问题,就需要20秒 30秒甚至更久,这样 ...
- Abp Vnext 中如何统一接口返回值
ABP Vnext Vue 的实现 https://github.com/WangJunZzz/abp-vnext-pro 在使用 abp 的过程中,如果提供给第三方接口要实现返回值统一需要怎么做? ...
- ES6中 Json、String、Map、Object 之间的转换
/** *字符串转json * */ static stringToJson(data){ return JSON.parse(data); } /** *json转字符串 */ static jso ...
- JVM的参数说明
Java虚拟机的参数说明 Java运行时数据区域: 线程共享区:方法区(永久区),堆 线程私有区:虚拟机栈,本地方法栈,程序计数器 JAVA_OPTS="-server -Duser.tim ...
- xtrabackup脚本
xtrabackup是MySQL的一种物理备份工具,相对于mysqldump,备份和还原速度更快 , 我写了一份可以进行备份 + 还原的脚本 #!bin/bash all_bak_path=" ...
- OS之《内存管理》
程序装入方式 绝对装入:程序逻辑地址和物理地址是完全对应的.不现实 可重定位装入:装入的时候重新 计算内存地址.程序中的实际地址加上程序载入的起始地址:但是解决不了进程挂起 后重新唤醒的问题.唤醒的后 ...
- 【分块】LibreOJ 6280 数列分块入门4
题目 https://loj.ac/p/6280 题解 将 \(n\) 个元素的数组 \(a\) 按块长 \(\sqrt{n}\) 进行分块处理.为每个块设置两个懒添加标记 \(add[i], sum ...
- 一图归纳三大种类矩阵范数:诱导范数,元素范数,Schatten范数,涵盖谱范数,2范数
转载自:https://blog.csdn.net/qq_27261889/article/details/87902480
- MongoDB|TOMCAT定时切割日志文件的脚本
MongoDB用过一段时间后,日志较大,需要定时进行日志切割. 一.切割bash: splitlogmongo.sh #!/bin/bash log_dir="/home/mongodb/l ...