在 Manim 动画制作中,Transform、TransformFromCopy、ReplacementTransform和Restore是四个通用的对象变换动画类。

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

  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的不同

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

对于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)

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. 如何通过 Vue+Webpack 来做通用的前端组件化架构设计

    目录:   1. 架构选型     2. 架构目录介绍     3. 架构说明     4. 招聘消息 目前如果要说比较流行的前端架构哪家强,屈指可数:reactjs.angularjs.emberj ...

  7. java利用注解及反射做通用的入参校验

    一.原理: 1.做一个field注解,注解有两个参数:是否必填.toString之后的最大长度 2.对某个request类(或基类),使用注解标记某个字段的校验详情 3.通用的static方法,利用反 ...

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

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

  9. thinkphp5高亮当前页(仅针对个人项目记录,不做通用参考)

    <div class="navbg"> <ul class="menu"> <li> <a href="/& ...

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

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

随机推荐

  1. 接口文档解决方案之Torna

    ◆一.开源项目简介 接口文档解决方案,目标是让接口文档管理变得更加方便.快捷.Torna采用团队协作的方式管理和维护接口文档,将不同形式的文档纳入进来统一维护. Torna弥补了传统文档生成工具(如s ...

  2. Educational Codeforces Round 155 (Rated for Div

    B. Chips on the Board 题解:贪心 显然我们可以把题意转化为:对于任意一个\((i,j)\),我们可以花费\(a_{i,j}\)的代价占据第\(i\)行和第\(j\)列,求占据所有 ...

  3. HEUCPC2021

    stral Reflection 在 \([1,n]\)上支持如下操作: 操作一:学习一个新的技能--清除 \([l,r]\)内所有的陨石 操作二:给定一个点集\(k\)代表陨石出现在这些位置,询问最 ...

  4. Mybatis【14】-- Mybatis如何实现一对多查询?

    ++注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-10-one2many,需要自取,需要配置ma ...

  5. ProcessExplorer 多功能任务管理器软件-中文绿色单文件版

    今天我和大家分享一款系统监控工具--ProcessExplorer.一个比Windows自带的任务管理器更强大的工具.感觉最实用的是他的搜索功能,可以搜到系统任务管理器里面无法显示的应用, 大家可以网 ...

  6. Dapr-3: 从 20000 英尺之上俯瞰 Dapr

    第 3 章 从 20000 英尺之上俯瞰 Dapr Dapr at 20,000 feet | Microsoft Docs 在第 1 章中,我们讨论了分布式微服务应用的吸引力.但是,我们也指出了它会 ...

  7. 渗透测试-前端加密分析之RSA+AES

    本文是高级前端加解密与验签实战的第8篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过RSA与AES加密来爆破登录. 由于RSA加解密有长度限制,以及解密速度等问题, ...

  8. 【NAS】绿联NAS UGOS PRO 使用natfrp(Sakura Frp)内网穿透访问Docker应用

    配置加速 https://registry.cn-hongkong.aliyuncs.com 下载镜像 创建容器 [容器]-[创建]-[手动创建]- 选择你下载的镜像即可 在日志中查看密码 访问容器 ...

  9. 永久告别mac屏幕涂层脱落

    转载:https://www.feng.com/post/11380203 我从2011年开始使用Mac book pro电脑,到现在的2016款已经是第三台了,我从来都不会被涂层脱落这个问题困扰,我 ...

  10. Linux sudo 提权之软链接攻击

    软链接提权的原理 低权限用户能够以 root 用户的权限执行某个脚本,该脚本中又使用到了诸如 chown 等命令修改文件的权限,且该文件又能够被低权限的用户所修改.因此低权限的用户可以删除该文件,然后 ...