manim边做边学--动画组合
动画组合类的作用是将多个动画组合起来,以实现更复杂的动画效果。
Manim中有4个用于动画组合的类:
AnimationGroup:将多个动画组合在一起同时播放,能一次性呈现多个对象的不同变化LaggedStart:按照添加顺序依次启动多个动画,每个动画间有延迟,使动画呈现出清晰的先后顺序LaggedStartMap:对一组对象应用相同动画,并按顺序逐个启动且有延迟,快速实现批量相似动画效果Succession:严格按照添加顺序依次播放多个动画,前一个完成后下一个才开始,确保动画按特定流程进行
1. 动画概述
1.1. AnimationGroup
当需要同时播放多个动画时,AnimationGroup非常有用。
例如,在一个场景中,需要同时移动多个图形、改变它们的颜色或执行其他操作。
AnimationGroup中包含的所有动画会同时开始和结束,可以通过设置lag_ratio参数来调整动画之间的延迟比例。
它的参数主要有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| animations | [Animation] | 要播放的动画对象序列 |
| group | Group | 包含多个Mobject的组 |
| run_time | float | 动画持续时间 |
| rate_func | func | 基于相对运行时间定义动画进度的函数 |
| lag_ratio | float | 定义动画应用于子对象的延迟 |
参数lag_ratio默认为0,表示所有动画同时播放。
若lag_ratio=0.5,表示下一个动画将在前一个动画播放到 50% 时开始。
1.2. LaggedStart
当需要按顺序播放多个动画,但希望它们之间有一定的延迟时,LaggedStart是一个很好的选择。
例如,依次显示一系列的文本内容或逐个移动多个对象。
LaggedStart用于创建具有节奏感的动画序列,使观众能够清晰地看到每个动画的发生过程。
动画会按照它们被添加的顺序依次启动,每个动画之间有一定的延迟。
它的参数主要有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| animations | [Animation] | 要播放的动画对象序列 |
| lag_ratio | float | 定义动画应用于子对象的延迟 |
| run_time | float | 动画的持续时间 |
1.3. LaggedStartMap
当需要对一组对象应用相同的动画,但希望它们之间有一定的延迟时,LaggedStartMap非常实用。
例如,逐个显示一组文本对象或逐个移动一组图形。
LaggedStartMap适用于处理大量相似对象的动画,通过简洁的方式实现逐个动画的延迟效果。
它的参数主要有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| AnimationClass | func | 要应用于mobject的动画类 |
| mobject | Mobject | 动画要应用到的Mobject |
| arg_creator | func | 要应用于Mobject的函数 |
| run_time | float | 动画的持续时间 |
| lag_ratio | float | 定义动画应用于子对象的延迟 |
1.4. Succession
当需要按顺序依次播放多个动画,且每个动画必须在前一个动画完成后才能开始时,Succession是首选。
例如,先移动一个对象,然后再对其进行旋转或缩放等操作。
Succession用于创建复杂的动画流程,确保动画按照特定的顺序执行,动画会按照它们被添加的顺序依次播放,前一个动画完成后,下一个动画才会开始。
它的参数主要有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| animations | [Animation] | 要播放的动画对象序列 |
| lag_ratio | float | 定义动画应用于子对象的延迟 |
| run_time | float | 动画的持续时间 |
2. 使用示例
下面通过一些示例演示这4个动画组合类的使用。
2.1. 同时移动和变色多个图形
此示例中,展示了AnimationGroup并行处理多个动画的能力。
示例中同时启动圆形的移动动画和正方形的变色动画,让多个对象的不同动画效果同时呈现,且所有动画在同一时刻开始和结束。
# 创建一个圆形和一个正方形
c = Circle().shift(LEFT * 2)
s = Square().shift(RIGHT * 2)
# 定义圆形的移动动画和正方形的变色动画
anim_circle = c.animate.shift(RIGHT * 4)
anim_square = s.animate.set_color(RED)
# 使用AnimationGroup同时播放这两个动画
self.play(AnimationGroup(anim_circle, anim_square))

2.2. 逐个显示文本内容
在这个示例中,LaggedStart的特点是按照添加动画的顺序依次启动,每个动画之间根据lag_ratio(这里设置为 0.3)产生延迟。
动画中可以清晰地看到每个文本依次淡入,营造出一种有序的节奏感,适合用于展示一系列相关元素的逐个出现效果。
# 创建三个文本对象
text1 = Text("死去元知万事空").shift(UP * 2)
text2 = Text("但悲不见九州同").next_to(
text1, DOWN, buff=0.5
)
text3 = Text("王师北定中原日").next_to(
text2, DOWN, buff=0.5
)
text4 = Text("家祭无忘告乃翁").next_to(
text3, DOWN, buff=0.5
)
# 定义每个文本对象的淡入动画
anim_text1 = FadeIn(text1)
anim_text2 = FadeIn(text2)
anim_text3 = FadeIn(text3)
anim_text4 = FadeIn(text4)
# 使用LaggedStart按顺序逐个启动动画,每个动画之间有一定延迟
self.play(
LaggedStart(
anim_text1,
anim_text2,
anim_text3,
anim_text4,
lag_ratio=0.3,
),
run_time=3,
)

2.3. 逐个移动一组点并变色
此例中,LaggedStartMap的优势在于可以方便地对一组对象应用相同的动画操作,并且通过lag_ratio(设置为 0.2)实现逐个对象动画的延迟效果。
这使得一组点能够逐个向下移动并变色,展示了批量处理相似对象动画且控制延迟的能力,适用于处理多个相同类型元素的动画序列。
# 创建一组点
dots = VGroup(*[Dot() for _ in range(5)]).arrange_in_grid(
rows=1, cols=5, buff=1
)
dots.shift(UP)
# 定义一个动画函数,用于移动点并变色
def move_and_color_dot(dot):
return dot.animate.shift(DOWN * 2).set_color(YELLOW)
# 使用LaggedStartMap对每个点应用动画函数,逐个启动动画且有延迟
self.play(LaggedStartMap(move_and_color_dot, dots, lag_ratio=0.2))

2.4. 先旋转后移动图形
在该示例中,Succession严格按照顺序依次执行动画。
先旋转五角星图形,然后向上下左右四个方向分别射出不同颜色的点。
# 创建一个三角形
star = Star()
dot1 = Dot(color=RED)
dot2 = Dot(color=GREEN)
dot3 = Dot(color=YELLOW)
dot4 = Dot(color=PURPLE)
self.add(star, dot1, dot2, dot3, dot4)
# 定义三角形的移动、旋转和缩放动画
rotate_star = Rotate(star, angle=PI * 2)
send_dot1 = dot1.animate.shift(UP * 2)
send_dot2 = dot2.animate.shift(RIGHT * 2)
send_dot3 = dot3.animate.shift(DOWN * 2)
send_dot4 = dot4.animate.shift(LEFT * 2)
# 使用Succession按顺序依次播放动画,前一个动画完成后下一个才开始
self.play(
Succession(
rotate_star,
send_dot1,
send_dot2,
send_dot3,
send_dot4,
),
run_time=3,
)

3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(anim_group.py),
下载地址: 完整代码 (访问密码: 6872)
manim边做边学--动画组合的更多相关文章
- window.requestAnimationFrame() ,做逐帧动画,你值得拥有
window.requestAnimationFrame() 方法告诉浏览器您希望执行动画,并请求浏览器调用指定的函数在下一次重绘之前更新动画.该方法使用一个回调函数作为参数,这个回调函数会在浏览器重 ...
- 边做边学入门微信小程序之仿豆瓣评分
微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...
- 动画-CAAnimationGroup(动画组合)
动画-CAAnimationGroup(动画组合) 我们知道IOS可以完成多种类型的动画,但是如果我们想在同一个时间端内同事完成两种或者两种以上的动画组合的时候是不是可以呢?答案是肯定的. 这里我们有 ...
- UIView封装动画--iOS利用系统提供方法来做转场动画
UIView封装动画--iOS利用系统提供方法来做转场动画 UIViewAnimationOptions option; if (isNext) { option=UIViewAnimationOpt ...
- Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain
近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...
- 用Direct2D和DWM来做简单的动画效果2
原文:用Direct2D和DWM来做简单的动画效果2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/detai ...
- 用Direct2D和DWM来做简单的动画效果
原文:用Direct2D和DWM来做简单的动画效果 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/detail ...
- WPF 后台代码做 TranslateTransform 的动画
本文告诉大家,在后台代码,对 TranslateTransform 做动画的方法 今天小伙伴问我一个问题,说为什么相同的代码,如果设置到按钮上,是可以让按钮的某个属性变更,但是如果设置给 Transl ...
- 【Leetcode 做题学算法周刊】第四期
首发于微信公众号<前端成长记>,写于 2019.11.21 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 67 ...
- 【从无到有】教你使用animation做简单的动画效果
今天写写怎么用animation属性做一些简单的动画效果 在CSS选择器中,使用animition动画属性,调用声明好的关键帧 首先声明一个动画(关键帧): @keyframes name{ from ...
随机推荐
- SpringBoot读取properties文件配置项
使用SpringBoot开发过程中,难免需要配置相关数据项,然后在Java代码中@Autowired注入并使用. 我们应该如何读取properties文件中的配置项呢? 基于SpringBoot项目, ...
- C240817D. 模拟赛:树上dp(以i为起点)+set操作
C240817D. 模拟赛 比较显然的树上dp, 但是维护set比较烦 考场上其实自己是定义 \(f[i]\) 是以 \(i\) 结尾, 然后这样的话单次更新根本做不到 \(O(logN)\). 反应 ...
- Johnson全源最短路:负权化正权,最后减去势能差
Johnson全源最短路:负权化正权,最后减去势能差 (1)建虚点0,add(0,i,0),跑st=0的单源最短路hi (2)e[i].w+=h[u]-h[v] Q:为何这样不会得到错误答案? ...
- php接收二进制流
/** 二进制流生成文件 * $_POST 无法解释二进制流,需要用到 $GLOBALS['HTTP_RAW_POST_DATA'] 或 php://input * $GLOBALS['HTTP_RA ...
- for Qbert sometimes we stay in lives == 0 condtion for a few frames —— baselines中环境包装器EpisodicLifeEnv的分析
相关: baselines中环境包装器EpisodicLifeEnv的分析 一直不是很理解在reinforcement leanrning算法在atari游戏的observation的交互过程中对li ...
- Go语言:未指定类型的常量(untyped int constant)和大整数的关系
运行下面的代码: 点击查看代码 package main import "fmt" const ( Big = 1 << 100 ) func needFloat(x ...
- Python新手教学
## 简介Python是一种简单易学的编程语言,广泛应用于各个领域,包括Web开发.数据科学.人工智能等.本文将为新手程序员提供Python基础知识的教学,包括变量.数据类型.条件语句.循环.函数等内 ...
- zynq 按照传统的Linux开发模式制作系统
参考资料 xilinx wiki: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/460653138/Xilinx+Open+Source ...
- Hibernate二级缓存 ---- 最佳实践
2010年11月7号,立冬,星期天.北京外面风好大,躲在家里整理一下这篇文章,发出来与大家分享,对大家有帮助是我最高兴的事儿. 不要想当然的认为使用了Hibernate的二级缓存就一定能够提高应用程序 ...
- 方法区回收过程与GC的并发与并行
主要回收废弃常量和无用的类 废弃常量包括字面量.类或接口.方法.字段的符号引用等 废弃指的是没有任何地方引用这个常量. 无用的类 满足的三个条件: 1.没有该类的任何实例存在 2.加载该类的Class ...