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 ...
随机推荐
- less 动态样式语言
1.less的介绍 Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展 官方文档 2.less需要编译才能被浏览器解析 浏览器 ...
- 使用Tesseract进行图片文字识别
Tesseract介绍 Tesseract 是一个开源的光学字符识别(OCR)引擎,最初由 HP 在 1985 年至 1995 年间开发,后来被 Google 收购并开源.Tesseract 支持多种 ...
- cajviewer逆向分析与漏洞挖掘
文章首发于 https://mp.weixin.qq.com/s/7STPL-2nCUKC3LHozN6-zg 前言 CAJViewer是一个论文查看工具,主要用于查看caj文件格式的论文.本文介绍对 ...
- 内存Fuzz和WinAFL
文章一开始发表在微信公众号 https://mp.weixin.qq.com/s/XSPrmBb44J8BUpKsj0cwGQ 内存Fuzz和WinAFL FoxitReader 软件分析 目前Fuz ...
- 鸿蒙UI开发快速入门 —— part08: 组件状态管理之@Provide/@Consume装饰器
1.说在前面的话 在此之前,我们已经先后学习了三个装饰器:@State.@Props.@Link,它们的功能和使用场景分别是什么?暂停会议一下. 我们目前已经可以处理组件内状态(@State),也可以 ...
- 覆盖全品类数据,腾讯云COS内容审核全新上线
今年,国家网信办深入推进"清朗·春节网络环境"专项行动.截至3月24日,网信办共累计清理相关违法违规信息208万余条,处置账号7.2万余个,协调关闭.取消备案网站平台2300余家. ...
- 在.NET Core中使用异步多线程高效率的处理大量数据的最佳实践
目录 一.引言 二.假设场景 三.解决方案 四.示例代码 一.引言 处理大量数据是一个常见的需求,传统的同步处理方式往往效率低下,尤其是在数据量非常大的情况下.本篇将介绍一种高效的多线程异步处理大数据 ...
- arch linux deepin-wine-wechat
https://aur.archlinux.org/packages/deepin-wine-wechat md5sum for WeChatSetup-3.9.0.28.exe should be ...
- Mac中nginx的默认安装路径和启动方式
1.安装完以后,可以在终端输出的信息里看到一些配置路径: /usr/local/etc/nginx/nginx.conf (配置文件路径) /usr/local/var/www (服务器默认路径) / ...
- javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplicati
把这两个勾选去掉