在制作数学动画时,我们常常希望动画的速度能够根据需要进行调整,以更好地展示数学概念的演变过程。

Manim框架中的ChangeSpeed类就是这样一个强大的工具,它能够帮助我们轻松地控制动画的速度变化,让动画更加生动和富有表现力。

1. 主要作用

ChangeSpeed类的主要作用是改变动画的播放速度

在数学动画中,有些部分可能需要快速展示,比如简单的平移或旋转;而有些部分则需要慢速展示,以便观众能够仔细观察其中的细节,比如复杂的函数变换或几何图形的构造。

通过使用ChangeSpeed类,我们可以对动画的速度进行精确的控制,让动画的节奏更加符合我们的需求。

一句话来说:动态控制动画的播放速度,实现加速/减速效果。

想象一辆小车:

  • 默认动画 → 小车匀速移动(枯燥)
  • 使用ChangeSpeed → 小车起步慢 → 中途加速 → 终点前减速(生动!)

它通过修改动画的时间流速实现变速,完美适配移动、旋转、变形等各类动画。

2. 参数详解

ChangeSpeed类的使用需要我们了解它的各个参数,其中最重要的参数就是speedinfo

这个参数是ChangeSpeed的灵魂!它是一个字典,定义不同时间点的速度倍率:

  • (Key):动画进度比例(0=开始,1=结束)
  • (Value):该时刻的速度倍数(1=原速,2=2倍速,0.5=半速)

设置speedinfo参数的示例如下:

# 先加速后减速(小车启动停止效果)
speedinfo = {
0: 0.3, # 开始时0.3倍慢速
0.7: 1.8, # 70%进度时1.8倍快速
1: 0.2 # 结束时0.2倍慢速
} # 匀速突然变慢(强调终点)
speedinfo = {
0: 1.0,
0.8: 1.0, # 前80%保持原速
1: 0.1 # 最后20%大幅减速
}

当然,除了speedinfo参数,ChangeSpeed类还有一些其他参数,比如动画的持续时间(duration)和动画的起始时间(start_time)。

这些参数比较简单,一看就明白它的含义。

3. 使用示例

下面通过两个示例来演示ChangeSpeed类的使用。

3.1. 模拟自由落体运动

小球下落逐渐加速,模拟重力加速。

class Example(Scene):
def construct(self):
ball = Circle(
radius=0.2,
color=RED,
fill_color=YELLOW,
fill_opacity=0.8,
)
path = Line(UP * 3, DOWN * 3) # 垂直路径 # 重力加速度效果:下落越来越快
speedinfo = {0: 0.1, 0.3: 0.5, 1: 2.0} self.play(
ChangeSpeed(MoveAlongPath(ball, path), speedinfo=speedinfo),
run_time=3,
) self.wait()

3.2. 重点展示轨迹关键点

这个示例展示一个沿着抛物线运动的点,在几个关键位置放慢速度,引起注意。

class Example(Scene):
# 求函数图像与坐标轴交点
def construct(self):
axes = Axes()
graph = axes.plot(lambda x: x**2)
dot = Dot(color=YELLOW) # 交点处减速强调
speedinfo = {
0: 1.2,
0.4: 1.2, # 快速移动到第一个交点
0.45: 0.1, # 在(0,0)减速
0.55: 1.0,
0.9: 1.0, # 快速移动到第二个交点
0.95: 0.1, # 在(1,1)减速
} self.play(
ChangeSpeed(MoveAlongPath(dot, graph), speedinfo=speedinfo),
run_time=5,
)
self.wait()

4. 总结

ChangeSpeed类是Manim框架中一个非常有用的工具,它为我们提供了对动画速度的灵活控制。

结合ChangeSpeed类来完成我们的动画,可以:

  1. 打破单调性 → 匀速动画易让观众走神,变速创造视觉节奏
  2. 符合现实规律 → 真实物理世界极少匀速运动(抛物线、摩擦力等)
  3. 突出关键信息 → 像电影慢镜头一样强调重点区域
  4. 提升专业感 → 细微的速度变化让动画媲美科教纪录片

掌握ChangeSpeed类:让数学动画速度随心而动!的更多相关文章

  1. 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动

    在Android中动画移动一个View的位置,采用Scroller类实现 今天说最近自己遇到的一个问题,就是要用动画效果来移动一个VIew的位置. 这个具体的情况是,需要做一个SlidingMenu的 ...

  2. ScaleAnimation类:尺寸变化动画类

    9.4  ScaleAnimation类:尺寸变化动画类 ScaleAnimation类是Android系统中的尺寸变化动画类,用于控制View对象的尺寸变化,该类继承于Animation类.Scal ...

  3. 背水一战 Windows 10 (42) - 控件(导航类): Frame 动画

    [源码下载] 背水一战 Windows 10 (42) - 控件(导航类): Frame 动画 作者:webabcd 介绍背水一战 Windows 10 之 控件(导航类) Frame 动画 示例An ...

  4. Math类的数学计算功能

    //Math类的数学计算功能 public class MathTest { public static void main(String[] args) { /*----------下面是三角运算- ...

  5. Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...

  6. Java:日历类、日期类、数学类、运行时类、随机类、系统类

    一:Calendar类 java.util 抽象类Calendar   1.static Calendar getInstance()使用默认时区和语言环境获得一个日历. 2. int get(int ...

  7. Android ScaleAnimation类:尺寸变化动画类

    ScaleAnimation类是Android系统中的尺寸变化动画类,用于控制View对象的尺寸变化,该类继承于Animation类. ScaleAnimation类中的很多方法都与Animation ...

  8. Math Number 数值类 包装类 数学计算 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. [19/03/18-星期一] 常用类_Math(数学)类&Rondom(随机数)类

    一.Math(数学)类(单独一个Java.Math 包中) java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般为double型.如果需要更加强大的数学运算能力, ...

  10. jQuery - 02. 样式表属性操作/类操作、动画、显示隐藏、滑入、淡入、停止动画、节点操作、添加对象、清空节点

    样式表属性操作.css $("div").css({'width':100,'height':100,'background':'red'}); $("div" ...

随机推荐

  1. golang定时器函数 每隔几分钟执行一个函数

    延时调用 AfterFunc go function() func function() { // TODO 具体逻辑 // 每5分钟执行一次,递归调用自己 time.AfterFunc(5*time ...

  2. Django实战项目-学习任务系统-文章汇总

    学习任务系统1.0版本已经基本完成了.现在按顺序整理下文章和链接,按照开发时间顺序列举,方便想要完整学习的人. 理论上说,按照文章代码可以搭建该系统的70%主体功能,剩下一些小的功能自己参考现有代码学 ...

  3. 昨晚接收的俄罗斯Meteor-M2气象卫星云图,接收质量还可以!

    接收设备: 天馈:自制四臂螺旋天线 硬件:SDRsharp 跟踪:Orbitron.SDRSharpDriverDDE 频率:137.1MHZ 解码:SDRSharp.QPSK.M2_LRPT_Dec ...

  4. Oracle使用Impdp导入dmp文件的详细过程

    这一天为了导入这个Oracle的dmp文件,简直就是血泪史,因本人对Oracle并不是很会,随意踩了很多小白会踩的坑,因此特意记录一下过程,防备下次的使用. 1.首先将你需要的dmp文件准备好,将其放 ...

  5. DEV插件--Spreadsheet1电子表格

    常用操作Spreadsheet常用属性标题栏是否可见 Spreadsheet1.TitleBar.Visible=true标题栏背景颜色 Spreadsheet1.TitleBar.Interior. ...

  6. 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密

    引言 最近遇到了一个 ActiveMQ 消费端的问题:在没有消息时,日志频繁打印,每秒打印2000多条空消息,导致日志文件迅速膨胀,甚至影响系统性能.经过一番排查,最终定位到问题根源并成功解决.本文将 ...

  7. 【Linux】3.10 进程管理(重点)

    进程管理 1. 进程管理基础 在Linux中,每个执行的程序(代码)都称为一个进程.每个进程都分配一个ID号 每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程.例如www服务器. 每个进 ...

  8. CoreOS 重启策略

    对于已经启动了的 CoreOS 集群,可以通过编辑/etc/coreos/update.conf文件来修改重启策略. 重启策略有以下4种: best-effort(默认):如果 etcd 运行正常则相 ...

  9. NGUI和UGUI的区别

    1.NGUI的渲染前后顺序是通过Widget的Depth,而UGUI渲染顺序根据Hierarchy的顺序,越下面渲染在顶层 2. NGUI支持图文混排,UGUI暂未发现支持此功能. 3.UGUI没有 ...

  10. 1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF.图像.Offic ...