manim边学边做--通用变换

news/2025/2/10 13:17:48/文章来源:https://www.cnblogs.com/wang_yb/p/18707646

Manim 动画制作中,TransformTransformFromCopyReplacementTransformRestore是四个通用的对象变换动画类。

这几个类能够实现从一个对象到另一个对象的平滑过渡复制并变换直接替换以及状态恢复等多种效果。

  1. Transform:将一个Mobject平滑地变换为另一个Mobject
  2. TransformFromCopy:从一个对象复制出一个副本,并将该副本变换为目标对象
  3. ReplacementTransform:将一个Mobject替换为另一个 Mobject,并且在变换过程中,原始对象会被目标对象完全替代
  4. Restore:将一个Mobject恢复到其之前保存的状态时使用

通过这些动画类,我们可以清晰地展示对象之间的关系、强调变换过程、突出替换逻辑,以及灵活地在不同状态之间切换。

它们在数学公式推导、图形变换、场景切换等场景中发挥着重要作用,为动画制作提供了强大的工具,帮助创作者以直观且富有表现力的方式呈现复杂的概念和过程。

1. 动画概述

1.1. Transform

Transform用于将一个Mobject平滑地变换为另一个Mobject。比如将一个正方形逐渐变为圆形,或者将一段文本替换为另一段文本。

它常用于数学公式推导、图形变换等场景,能够直观地展示从一种状态到另一种状态的过渡。

Transform 是一个通用的变换类,可以对形状、位置、颜色等多种属性进行变换。

变换过程中,原始对象和目标对象都会保留在场景中,直到动画结束。如果需要在变换后移除原始对象,需要手动操作。

它的参数主要有:

参数名称 类型 说明
mobject Mobject 要被变换的对象
target_mobject Mobject 变换的目标对象
path_arc float 如果使用圆形路径,指定点移动的弧度
path_func func 定义了 mobject 的点在变换过程中所走的路径。可以使用 Manim 提供的路径函数或自定义函数。
path_arc_axis np.ndarray 如果使用圆形路径,指定旋转的轴
path_arc_centers np.ndarray 如果设置了此参数且未设置path_func,则会生成一个沿圆形路径的路径函数。此参数定义了圆形路径的中心。
replace_mobject_with_target_in_scene bool 控制动画完成后,是否用target_mobject替换mobject

1.2. TransformFromCopy

当需要从一个对象复制出一个副本,并将该副本变换为目标对象时使用TransformFromCopy。例如,在讲解数学公式时,从一个已有的公式中复制一部分并将其变换为新的表达式。

TransformFromCopy适用于强调某个对象的复制和变换过程,使观众更清楚地看到变换的来源。

TransformFromCopy实际上是Transform的一个变体,它先对原始对象进行复制,然后对复制的对象执行变换动画。

原始对象在动画过程中保持不变,变换的是其副本,这使得动画效果更加清晰,避免了原始对象的直接改变。

它的参数类似Transform的参数。

1.3. ReplacementTransform

ReplacementTransform用于将一个Mobject替换为另一个Mobject,并且在变换过程中,原始对象会被目标对象完全替代。

例如,在展示数学公式推导时,将一个公式直接替换为另一个公式,强调两者的等价性或替换关系。

ReplacementTransform适用于需要明确表示对象被替换的场景,强调变换的“替代”性质。

ReplacementTransform继承自Transform类,但它在变换完成后会移除原始对象,只保留目标对象。

它更强调“替换”的效果,而不是像Transform那样保留原始对象和目标对象同时存在一段时间。

它的参数类似Transform的参数。

1.4. Restore

当需要将一个Mobject恢复到其之前保存的状态时使用Restore

例如,在对一个图形进行了一系列复杂的变换后,需要将其恢复到初始状态,或者在展示一个对象的多种变换后,恢复到某个特定的中间状态。

Restore适用于需要反复展示对象不同状态的场景,如对比不同变换效果、演示可逆变换等。

它需要先通过Mobject.save_state()方法保存对象的状态,然后才能使用Restore动画将其恢复。

它的参数主要有:

参数名称 类型 说明
mobject Mobject 要恢复的对象

2. 使用示例

下面通过示例来演示这几个转换动画的效果。

2.1. 通用转换Transform

这个示例中,将一个数学公式和一个图形平滑地变换为另一个公式和图形。

变换中,设置了path_arc参数,以一个弧形的路径变换为目标对象。

# 创建初始公式
f1 = MathTex("a^2 + b^2 = c^2").shift(UP)
# 创建目标公式
f2 = MathTex("c = \\sqrt{a^2 + b^2}").shift(DOWN)# 创建一个正方形
square = Square(side_length=1, color=BLUE).shift(DOWN)
# 创建一个圆形
circle = Circle(radius=0.6).shift(UP)self.add(f1, square)
self.wait()
# 使用 Transform 将公式1变换为公式2,将正方形变换为圆形
self.play(Transform(f1, f2, path_arc=PI),Transform(square, circle, path_arc=PI),
)

2.2. 比较Replace和Copy的不同

通过这个示例,可以了解TransformFromCopyReplacementTransform两种动画效果的区别,帮助我们根据实际需求选择合适的动画类。

对于TransformFromCopy

  1. 从原始对象复制出一个副本,并对副本进行变换
  2. 原始对象保持不变,变换的是副本
  3. 适用于需要保留原始对象的场景

对于ReplacementTransform

  1. 直接将原始对象替换为目标对象
  2. 原始对象在动画结束后被移除,目标对象取代其位置
  3. 适用于需要明确表示对象被替换的场景

下面的示例中,TransformFromCopy每次转换都会保存原对象,而ReplacementTransform则只保留变换后的目标对象。

# 创建两个相同的正方形作为原对象
s1 = Square().shift(LEFT * 1.5)
s2 = Square().shift(RIGHT * 1.5)# 创建两个圆形作为目标对象
c1 = Circle().shift(LEFT * 1.5)
c2 = Circle().shift(RIGHT * 1.5)t1 = Triangle().shift(LEFT * 1.5)
t2 = Triangle().shift(RIGHT * 1.5)# 添加原对象到场景中
self.add(s1, s2)
self.wait(1)# 添加标题用于区分两种变换
title1 = Text("TransformFrom Copy",t2g={"Copy": [BLUE, RED, YELLOW]},font_size=25,
).next_to(s1, UP)
title2 = Text("Replacement Transform",t2g={"Replacement": [BLUE, RED, YELLOW]},font_size=25,
).next_to(s2, DOWN)
self.add(title1, title2)
self.wait()# 使用 TransformFromCopy 对左边的图形进行变换
# 使用 ReplacementTransform 对右边的图形进行变换
self.play(TransformFromCopy(s1, c1),ReplacementTransform(s2, c2),
)
self.wait()
self.play(TransformFromCopy(c1, t1),ReplacementTransform(c2, t2),
)

2.3. 恢复初始状态Restore

这个示例中,先创建一个六边形,先变换成星形,再经过一系列其他的变换,比如颜色,透明度,移动,放大,翻转等变换。

最后通过Restore直接恢复成原始状态。

# 创建一个六边形
hexagon = RegularPolygon(n=6)
# 保存六边形的初始状态
self.add(hexagon)
hexagon.save_state()
# 将六边形变换为一个星形
star = Star(color=RED)
self.play(Transform(hexagon, star), run_time=run_time)
self.wait()
self.play(Restore(hexagon))self.play(hexagon.animate.set_color(YELLOW).set_opacity(0.4), run_time=run_time)
self.play(hexagon.animate.shift(RIGHT).scale(2), run_time=run_time)
self.play(hexagon.animate.rotate(PI * 0.75), run_time=run_time)# 使用 Restore 恢复六边形的初始状态
self.play(Restore(hexagon))

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(transform.py),

下载地址: 完整代码 (访问密码: 6872)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

执行abp命令时,出现死循环解决方案

今天把长时间不用的ABP Cli进行升级 将原有:volo.abp.cli卸载。安装了新的 Volo.Abp.Studio.Cli。 任何执行abp new Acme.BookStore -m none --theme leptonx-lite -csf创建项目。 于是出现以下问题(Abp找不到对应的包):分析原因 本人是设置过Nuget.cofig文件中 全局包文件…

Git: submodule 子模块简明教程

序 有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。 Git 通过子模块来解决这个问题。 子模块允许你将一个 Gi…

内外网文件交换与数据共享系统:企业级跨网高效传输解决方案

一、产品介绍 产品定位:可以实现在企业内外网物理隔离情况之下,进行文件的安全交换(导入文件、刻录文件)、进行在线审批流程、实现在线审计、并对传输文件进行实施病毒查杀。 产品介绍:内外网安全文件交换系统是企业内部实现高效文件传输的管理系统: 1.支持用户通过光盘导…

EXCEL根据字体颜色排序 ,颜色相同的集中显示在最上面

自定义排序--选择指定列--选择 字体颜色 --相应颜色--在顶端以集中显示 结果如下图:

conda创建环境之后只有空荡荡的文件夹

如题 在创建环境之后,在该环境的文件夹中只有conda-meta和etc两个文件夹变成这样的原因是在创建虚拟环境的时候只是执行了 conda create -n test 而正确的应该是执行 conda create -n test python 若指定python版本应该加上 conda create -n test python=

FireDAC数据库连接流程图

FireDAC数据库连接流程图

老年人评估进程三

2025年2月9日 今天我们基本完成了老年人评估系统的功能,其中我后端遇到的问题,我觉得 是mapper层与xml映射文件的对接,这里命名我是按照规定进行创建和设置的, 但是在最后监护人页面的多条件查询时,出现了问题:mybatis参数映射出现 了问题,找不到Mappe接口等问题,最后无…

【日记】给了朝哥他们一家五百多块的购物卡(1568 字)

正文我从来都不知道背转在旋转的时候手和腿还要发力……前天上了年后的第一次课。课上朝哥原本打算教我背转,教给我需要注意的点。但他说的背转过程中还要发力,这真的超乎我的想象。说是背转,其实也没有练习多久。因为最后课上还是让我试试推风车,看看哪里有问题。如自己所…

3.3 计算机运算出错的原因

计算机运行出错的原因是因为 有一些十进制数的小数无法转换成二进制数因为无法正确表示的数值,最后都变成了近似值 因此,在遇到循环小数时,计算机会根据变量数据类型所对应的长度将数值从中间截断或者四舍五入

3.2 用二进制数表示小数

1011.0011这个有小数点的二进制数转换成十进制数 小数点前面的部分 将各数位数值和位权相乘,然后再将相乘的结果相加即可实现 小数点后面的处理和整数部分是一样的0次幂前面的位的位权按照1次幂、2次幂.....的方式递增 0次幂以后的位的位权按照-1次幂、-2次幂.....的方式递减 …

CF475E 证明

考虑观察最优解的一些性质:性质 1:一个非叶子节点的入度和出度非 0。 证明:显然把任意一条邻边翻转之后会更优。性质 2:若 \(x\) 可达 \(y\),则 \(out_x>1\) 和 \(in_y>1\) 不会同时成立。 证明:如图,设能到 \(x\) 的点数为 \(A\),\(x\) 能到达的点数为 \(B\)(不…

浏览量超 10w 的热图,描述 RAG 的主流架构

这张图近期在国外社区传播比较多,结构化的描述了 RAG 的主流架构。RAG 用于提升大模型的生成效果,使得大模型更加智能,而持续提升的大模型语义和逻辑推理能力,又能更加精准的识别和应用专业知识库。本文将梳理 RAG 的基本信息,旨在获得更加清晰的理解。作者:望宸 大模型性…