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

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参数,设置第一个先减速移动,然后再加速移动,最后再次减速移动。

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

```python
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,
    ),
)
```

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

2.2. 变速旋转的正方形

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

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

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

```python
square = Square()

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

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

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

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

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

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

```python
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,
    )
)
```

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

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

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

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

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

```python
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,
    )
)
```

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

3. 附件

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

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

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/5391.html

(0)
LomuLomu
上一篇 2025 年 1 月 6 日 下午1:41
下一篇 2025 年 1 月 6 日 下午2:43

相关推荐

  • 如何用串口调试助手ComTone调试串口?附安装包

    前言 大家好,我是小徐啊。我们在调试应用的时候,有时候是需要进行串口通信的。但并不是每次都有实时的串口数据供我们去测试,这个时候就需要一个模拟生成串口数据的工具来帮助我们了。今天,小徐就来介绍下串口调试助手ComTone的用法。文末附获取方式。 如何使用串口调试助手ComTone 首先,需要选择对应的端口号,这个必须是能联通的串口号,然后点击打开串口按钮,如…

    2025 年 1 月 10 日
    26700
  • 【Java】还在死磕算法?懂“堆”与“优先级队列”,代码效率飙升

    个人主页:喜欢做梦 欢迎 💛点赞 🌟收藏 💫关注 🏆堆 一、🎯什么是堆 堆的概念 堆是一种特殊的完全二叉树 ,如果有一个关键码的集合K={k0,k1,k2,…,kn-1} ,把它所有的元素按照完全二叉树的顺序存储方式 在一维数组 中,并满足:Ki

    2025 年 1 月 6 日
    23900
  • JavaScript 延迟加载的方法( 7种 )

    JavaScript脚本的延迟加载(也称为懒加载)是指在网页的主要内容已经加载并显示给用户之后,再加载或执行额外的JavaScript代码。这样做可以加快页面的初始加载速度,改善用户体验,并减少服务器的压力。 以下是几种常见的延迟加载JavaScript的方法: defer 属性: 使用 async 属性: async 属性告诉浏览器立即开始下载脚本,并且在…

    2025 年 1 月 5 日
    25600
  • 基于ABP框架与Entity Framework(非Core版)和MySQL的大数据分页查询优化方案

    在利用ABP框架整合Entity Framework(非Core版)和MySQL处理海量数据分页查询时,需要针对MySQL的特性与EF的分页功能进行深度优化。以下为详细的实现策略与技术要点: 一、摒弃传统分页方式传统的Skip().Take()方法在EF中会被转换为LIMIT OFFSET语法,当处理百万级数据时性能表现极差。优化方案包括:1. 主键/唯一键…

    未分类 2025 年 5 月 11 日
    7600
  • 华为OD机试E卷 –补种未成活胡杨 –24年OD统一考试(Java & JS & Python & C & C++)

    文章目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码 python算法源码 c算法源码 c++算法源码 题目描述 近些年来,我国防沙治沙取得显著成果。某沙漠新种植 N 棵胡杨(编号 1-N),排成一排一个月后,有 M 棵胡杨未能成活现可补种胡杨 K 棵,请问如何补种 (只能补种,不能新种),可以得到最多的连续胡杨树? 输入描…

    未分类 2024 年 12 月 31 日
    31900

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信