manim边学边做--局部变换

本次介绍的两个用于变换的动画类: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 会自动尝试匹配相似的形状并进行转换,这里由于形状类型不同,会进行相应的变形动画。

python 复制代码
# 创建起始形状
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 会按照我们指定的规则进行形状转换。

python 复制代码
# 创建起始形状
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 会将分组的部分作为一个整体进行匹配和转换。

python 复制代码
# 创建起始公式
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)

相关推荐
忧陌60624 分钟前
Day22打卡-复习
python
Sylvan Ding1 小时前
PyTorch Lightning实战 - 训练 MNIST 数据集
人工智能·pytorch·python·lightning
水银嘻嘻2 小时前
web 自动化之 Unittest 应用:报告&装饰器&断言
前端·python·自动化
攻城狮7号2 小时前
Python爬虫第20节-使用 Selenium 爬取小米商城空调商品
开发语言·数据库·爬虫·python·selenium
虚空之月&&轮舞者4 小时前
Python与矢量网络分析仪3671E:自动化测试(Vscode)
网络·vscode·python·射频工程
李昊哲小课4 小时前
tensorflow-cpu
大数据·人工智能·python·深度学习·数据分析·tensorflow
小彭律师9 小时前
数字化工厂中央控制室驾驶舱系统架构文档
python
old_power10 小时前
【Python】PDF文件处理(PyPDF2、borb、fitz)
python·pdf
测试开发Kevin11 小时前
从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架
python·pytest
强化学习与机器人控制仿真11 小时前
Newton GPU 机器人仿真器入门教程(零)— NVIDIA、DeepMind、Disney 联合推出
开发语言·人工智能·python·stm32·深度学习·机器人·自动驾驶