本次介绍的两个用于变换的动画类:TransformMatchingShapesTransformMatchingTex

它们的主要特点是对一组对象或一段文本进行局部变换,适用于复杂的图形或者文本的变换场景。

其中:

  1. TransformMatchingShapes:用于不同形状的 VMobject 间转换,能自动匹配相似形状并创建平滑过渡动画,也支持手动指定匹配方式,适用于图形拼接、拆分等场景
  2. 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,
),
)

从动画可以看出,各种原始图形自动变换为跟自己最为接近的图形:

  1. 蓝色圆形自动匹配转换为黄色正八边形
  2. 红色正方形转换为红色的菱形
  3. 黄色正八边形转换为蓝色三角形
  4. 绿色的星形没变

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边学边做--局部变换的更多相关文章

  1. 学EE做硬件找工作不如学CS做软件,为什么会这样?

    学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...

  2. 牛腩学Kotlin做Android应用

    牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...

  3. php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)

    php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...

  4. html5-3 html5标签(热点地图如何实现)(边学边做)

    html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl  自定义列表dt  自定义标题dd  自定义列表内容 2. ...

  5. 第一份开发工作,边学边做android

    我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...

  6. 边学边做,简单的 GraphQL 实例

    项目中有功能要调用 API,对方 API 用的是 GraphQL 实现,就简单学了下,感叹技术进步真快,Facebook 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...

  7. NGUI 做局部2d卷轴

    网上找到的都是做整个背景的卷轴动画,通常是改变纹理位置或者背景图片的x坐标 没有提到在UI界面里某个部分做卷轴动画,找了很久,才发现NGUI的Panel里的Clipping属性可以裁剪Panel的大小 ...

  8. 使用vue来做局部刷新

    我们都知道,vue的组件化是他最强大的核心所在,路由也是特别可爱的一部分,但是路由适合一些大型的组件,看url路径的时候会出现变化,但是有时候我们想要一些小的局部小刷新,这个时候就需要用到它的动态组件 ...

  9. LabVIEW Actor Framwork (2)________ 边学边做server&client

    回顾下初始需求: 现在要做一个类似聊天的demo,一个server端,若干个client端:首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给serv ...

  10. STM32F103VET6 ADC采集64点做FFT变换

    http://www.stmcu.org/module/forum/thread-598459-1-11.html http://bbs.21ic.com/icview-589756-1-1.html ...

随机推荐

  1. VUE懒加载的table前端搜索

    // 前端搜索 fliterData() { const search = this.search if (search) { this.blist = this.list.filter(item = ...

  2. 网站安全锁-SSL证书

    为了安全起见,现在开发微信服务号和IOS客户端等访问服务器端都要求使用https加密传输. SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证 ...

  3. Codeforces Round 855 (Div

    Problem - E2 - Unforgivable Curse (hard version) 给定一个初始字符串s和目标字符串t,我们可以对字符串s进行以下任意次操作: 对于位置\(i\),如果\ ...

  4. WinForm(C/S)项目中使用矢量字体(FontAwsome、Elegant)图标

    1.介绍 字体图标在Web应用中最为常见,字体图标是矢量的,矢量图意味着每个图标都能在所有大小的屏幕上完美呈现,可以随时更改大小和颜色,而且不失真.字体图标常见的有Font Awesome和Elega ...

  5. Postgres中的Common Table Expression

    Common Table Expression 是 pg 里极为重要的特性.这个特性简单的说就是 INSERT/UPDATE/DELTE 三项操作可以返回结果集.如: update item set ...

  6. Postgresql使用触发器实现同步插入两张表

    在有一个陈旧的系统的情况下,如果升级API可以优先使用微服务的形式,将数据库进行独立拆分,将原来的数据库原原本本地固定在旧系统中,然后在独立的微服务中运行与部署新系统. 如果原有的数据需要在更换结构的 ...

  7. 【转载】Spring Cloud Gateway-全局过滤器(Global Filters)

    http://www.imooc.com/article/290821 TIPS 本文基于Spring Cloud Gateway SR2,理论适配Spring Cloud Gateway SR1以及 ...

  8. Qt编写的项目作品14-智能安防集中管理平台

    一.功能特点 同时集成了楼宇对讲.住户报警.门禁控制.公共报警.视频监控等模块. 系统管理部分包括系统配置.对讲配置.住户配置.公共配置.监控配置.地图管理.视频联动.用户管理.区域管理. 图形化的实 ...

  9. Qt开源作品4-网络调试助手

    一.前言 网络调试助手和串口调试助手是一对的,用Qt开发项目与硬件通信绝大部分都是要么串口通信(RS232 RS485 Modbus等),要么就是网络通信(TCP UDP HTTP等),所以一旦涉及到 ...

  10. [转]win10 vue-cli 下载成功,显示 vue不是内部或外部命令,也不是可运行的程序

    vue不是内部或外部命令,也不是可运行的程序 1.安装vue-cli npm install -g @vue/cli 2.查看是否安装成功 vue -V 经过上述步骤,一般在CMD窗口输入" ...