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)

相关推荐
郭庆汝5 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
思则变8 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络9 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find10 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取11 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector12 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习13 小时前
Python入门Day2
开发语言·python
Vertira13 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉13 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗13 小时前
黑马python(二十四)
开发语言·python