manim边学边做--改变动画速度

news/2025/1/10 21:35:49/文章来源:https://www.cnblogs.com/wang_yb/p/18640752

ChangeSpeed类是Manim库中用于修改动画速度的类。

它提供了一种灵活的方式来控制动画的播放速度,使动画在不同时间段内以不同的速度播放,从而创造出更加丰富多样的动画效果。

比如,在创建包含多个元素动画的场景中,通过ChangeSpeed可以精确控制不同元素在不同时间点的移动速度,实现复杂的动画节奏编排。

1. 动画概述

与之前介绍的那些动画类不同,ChangeSpeed不是为元素实现某种具体的动画效果,

它的作用对象是动画本身,它的主要特点有:

  1. 灵活的速度调整:可以指定动画在不同时间对应的速度因子,也就是在动画的不同阶段设置不同的速度
  2. 与多种动画类型结合:不仅可以用于修改单个动画的速度,还能处理AnimationGroup类型的动画,将多个动画组合成一个整体进行速度控制
  3. 支持速率函数覆盖:通过rate_func参数可以覆盖传入动画的速率函数,从而进一步自定义动画的速度变化曲线

主要参数有:

参数名称 类型 说明
anim Animation 需要修改速度的动画对象
speedinfo dict 指定在不同时间点的动画速度
rate_func func 覆盖传入动画的速率函数,在修改速度之前应用
affects_speed_updaters bool 决定是否影响通过add_updater方法添加的更新器的速度

speedinfo参数是一个字典,

它的key是动画运行时间的百分比(0 到 1 之间的浮点数),value是对应的速度因子。

affects_speed_updaters参数一般在做联动动画时使用的,用来决定是否影响联动动画的速度。

ChangeSpeed还有一些方法,可以用于全面控制动画的执行流程、时间相关属性和相关对象的处理。

名称 说明
add_updater 用于将速度变化应用于更新器
begin 在动画开始时被调用时,进行初始化操作
finish 动画结束时被调用
update_mobjects 更新相关对象,如起始对象和(对于变换动画)目标对象
clean_up_from_scene 在动画结束后清理场景
get_scaled_total_time 返回动画所花费的时间
interpolate 在动画的每一帧被调用,用于设置动画的进度

2. 使用示例

下面通过示例来演示如何使用ChangeSpeed类来丰富动画的表现效果。

2.1. 变速移动的点

此示例在场景中创建了两个点,然后使用ChangeSpeed类来控制其移动动画。

通过speedinfo参数,设置第一个先减速移动,然后再加速移动,最后再次减速移动。

第二点与第一个点的速度变化正好相反,并且两个点在运动过程中都采用线性速率函数。

d1 = Dot(color=BLUE)
d2 = Dot(color=RED)
self.add(d1, d2)# 先慢后快再慢
self.play(ChangeSpeed(d1.animate(run_time=2).shift(RIGHT * 5),speedinfo={0.2: 0.5, 0.3: 2, 0.8: 0.5},rate_func=linear,),
)# 先快后慢再快
self.play(ChangeSpeed(d2.animate(run_time=2).shift(LEFT * 5),speedinfo={0.2: 2, 0.3: 0.5, 0.8: 2},rate_func=linear,),
)

2.2. 变速旋转的正方形

先添加了一个正方形,然后利用ChangeSpeed类来调整其旋转动画。

根据speedinfo设定,正方形在动画开始的前 30% 时间内慢速旋转(速度因子为 0.5),之后在 70%~100% 时间内快速旋转(速度因子为 2),

同时使用平滑的速率函数,产生了变速旋转的动画效果。

square = Square()# 正方形先慢速旋转 然后快速旋转
self.play(ChangeSpeed(Rotate(square, angle=PI, run_time=3),speedinfo={0.3: 0.5, 0.7: 2},rate_func=smooth,)
)

2.3. 结合更新器的变速缩放

首先创建了一个圆,并定义了一个更新器函数,使圆在每一帧渲染时按一定比例持续缩放。

接着通过ChangeSpeed类的静态方法add_updater将更新器应用到圆上,并根据speedinfo参数,使得更新器在动画中间部分速度变慢,从而实现了圆的变速缩放效果。

注意,这里要设置affects_speed_updaters=True,否则圆会匀速放大,使得speedinfo参数无效。

circle = Circle()
self.add(circle)# 定义一个更新器函数,使圆持续缩放
def update_circle(circle, dt):circle.scale(1 + 0.1 * dt)# 将更新器添加到圆上,并使用ChangeSpeed控制更新器的速度
ChangeSpeed.add_updater(circle, update_circle)
self.play(ChangeSpeed(Wait(4),speedinfo={0.3: 2, 0.4: 0.4, 0.7: 0.4, 1: 2},affects_speed_updaters=True,)
)

2.4. 动画组中元素的不同速度

在场景中添加了两条水平方向且一上一下的直线,通过ChangeSpeed类作用于AnimationGroup来实现不同速度的动画效果。

因为speedinfo参数只能设置一种速度因子,为了使两条直线的变色速度不一样,这里使用了一个技巧,设置两条直线变色的run_time不一样。

这样,即使它们的speedinfo参数一样,最终还是以不同节奏来变色。

l1 = Line(LEFT * 3, RIGHT * 3).shift(UP)
l2 = Line(LEFT * 3, RIGHT * 3).shift(DOWN)
self.add(l1, l2)# 创建一个动画组,使两条线以不同的速度变色
self.play(ChangeSpeed(AnimationGroup(l1.animate(run_time=2).set_color(RED),l2.animate(run_time=4).set_color(BLUE),),speedinfo={0.3: 1,0.6: 0.5,1: 1,},rate_func=linear,)
)

3. 附件

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

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

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

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

相关文章

进程间通信组件ZeroMQ详解

在一些复杂的项目中,往往会由不同功能的程序组成,且在程序运行期间,各个程序还需要进行互相通信,实现进程间通信的方式有很多种,最常用的就是通过消息中间件,比如RabbitMQ,Kafaka,以及ZeroMQ等,而RabbitMQ和Kafaka这两款中间件往往都需要独立安装步骤才能使用,ZeroMQ…

Mongodb安装步骤 (.msi安装方式)

我之前发的Mongodb安装步骤 ,被人建议使用 .msi安装方式 所以重新发一版 Mongodb安装步骤 (.msi安装方式) 一、首先下载安装程序 下载链接 Try MongoDB Community Edition | MongoDB 选择 .msi 二、安装 1、双击.msi 2、next: 3、勾选接受,next: 4、complete是默认安装…

[Windows] 数据恢复软件R-Studio 8.14.179623

R-Studio是一个功能强大、节省成本的反删除和数据恢复软件系列。它采用独特的数据恢复新技术,为恢复FAT12/16/32、NTFS、NTFS5(由 Windows 2000/XP/2003/Vista/Windows 8/Windows 10创建或更新)、Ext2FS/Ext3FS(OSX LINUX 文件系统)以及 UFS1/UFS2(FreeBSD/OpenBSD/NetBS…

期末考试

每日总结管理系统: 此软件的主要用户包括学生、小组长、教师;各个用户主要功能为: (1)学生:写日报,修改日报,浏览日报、查询个人日报,查看站内消息。 (2)小组长:日报形式审核,发表情况统计,日报消息,查询日报。 (3)教师:日报评分,发表情况统计,日报消息,查…

【转载】什么是Banner以及测试时需要注意的点

设计中的banner图和测试中的banner图大家好,我是莫宁。相信很多新手小白在近几年也有听说过“banner”吧,是不是很疑惑。反正莫宁刚入门的时候是对这个词很陌生,不知道什么。今天就来为各位小伙伴解答这个疑问吧!什么是Banner?大家都知道“banner”翻译过来是横幅的意思,…

什么是Banner以及测试时需要注意的点

设计中的banner图和测试中的banner图大家好,我是莫宁。相信很多新手小白在近几年也有听说过“banner”吧,是不是很疑惑。反正莫宁刚入门的时候是对这个词很陌生,不知道什么。今天就来为各位小伙伴解答这个疑问吧!什么是Banner?大家都知道“banner”翻译过来是横幅的意思,…

CDS标准视图:功能位置可用标签 I_FUNCNLLOCALTERNATIVELABEL

视图名称:功能位置可用标签 I_FUNCNLLOCALTERNATIVELABEL 视图类型:基础 视图代码:点击查看代码 @EndUserText.label: Functional Location Alternative Labels @VDM.viewType: #BASIC @AccessControl.authorizationCheck: #CHECK @AbapCatalog.sqlViewName: IFUNCTLOCALTLB…

大学微积分 AB 第六单元-4:变革的整合与积累(微分方程简介、可分离方程简介)

微积分的关系 微积分的基本定理将微分与积分联系起来,表明在某种意义上,微分和积分是互为反操作的。具体而言:若你首先对一个函数进行积分(求其原函数),然后对这个原函数进行微分,那么你会得到最初的函数。 反之亦然,若你对一个函数进行微分然后进行积分,你将得到相同…

windows如何安装JDK8?附安装包

前言 大家好,我是小徐啊。我们在开发Java的时候,第一步就是需要安装JDK,今天,小徐来介绍下Java开发中,最流行的JDK8的安装方式。文末附获取方式。 如何安装JDK8 首先,双击JDK8的安装包,开始安装。然后,会弹出Java SE8的一些说明,查看一下,然后点击下一步按钮即可。然…

最新扣子(Coze)实战案例:小红书爆款小新歪理漫画,批量处理节点的使用详细讲解,手把手教学,完全免费教程

今天通过一个小红书爆款漫画《小新歪理》来为大家讲解Coze中批处理节点的使用。 先看生成后的效果:接下来,话不多说,斜杠君用最简单的方式教给大家。 大家可以关注收藏,以免之后找不到,而且也不会错过我后面的教程。 网页链接​mp.weixin.qq.com/s/74WlVI7nCBirDQfMEynQJQ…

北京某新能源汽车生产及办公网络综合监控项目

北京智和信通监控运维方案,基于核心产品智和网管平台SugarNMS,全面覆盖并管理用户生产与办公环境中的各类网络设备、安全设施、服务器及主机等信息技术基础设施,并成为提升企业运营效率、保障生产线稳定运行的重要工具 北京某新能源汽车是某世界500强汽车集团旗下的新…

如何升级云服务器操作系统而不丢失现有数据?

问题描述: 随着业务的发展和技术的进步,用户希望能够对其云服务器的操作系统进行升级,以享受更高版本带来的新特性和性能改进。然而,担心在升级过程中会导致原有应用程序和服务的数据丢失。请问在不影响业务的前提下,怎样安全地完成操作系统升级? 解决方案: 当计划对云服…