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

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

ChangeSpeed类是Manim库中用于修改动画速度的类。
它提供了一种灵活的方式来控制动画的播放速度,使动画在差别时间段内以差别的速度播放,从而创造出更加丰富多样的动画效果。
好比,在创建包含多个元素动画的场景中,通过ChangeSpeed可以精确控制差别元素在差别时间点的移动速度,实现复杂的动画节奏编排。
1. 动画概述

与之前介绍的那些动画类差别,ChangeSpeed不是为元素实现某种详细的动画效果,
它的作用对象是动画本身,它的主要特点有:

  • 灵活的速度调整:可以指定动画在差别时间对应的速度因子,也就是在动画的差别阶段设置差别的速度
  • 与多种动画范例结合:不仅可以用于修改单个动画的速度,还能处置惩罚AnimationGroup范例的动画,将多个动画组合成一个整体举行速度控制
  • 支持速率函数覆盖:通过rate_func参数可以覆盖传入动画的速率函数,从而进一步自定义动画的速度变化曲线
主要参数有:
参数名称范例分析animAnimation需要修改速度的动画对象speedinfodict指定在差别时间点的动画速度rate_funcfunc覆盖传入动画的速率函数,在修改速度之前应用affects_speed_updatersbool决定是否影响通过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参数,设置第一个先减速移动,然后再加速移动,最后再次减速移动。
第二点与第一个点的速度变化恰好相反,并且两个点在运动过程中都采用线性速率函数。
  1. d1 = Dot(color=BLUE)
  2. d2 = Dot(color=RED)
  3. self.add(d1, d2)
  4. # 先慢后快再慢
  5. self.play(
  6.     ChangeSpeed(
  7.         d1.animate(run_time=2).shift(RIGHT * 5),
  8.         speedinfo={0.2: 0.5, 0.3: 2, 0.8: 0.5},
  9.         rate_func=linear,
  10.     ),
  11. )
  12. # 先快后慢再快
  13. self.play(
  14.     ChangeSpeed(
  15.         d2.animate(run_time=2).shift(LEFT * 5),
  16.         speedinfo={0.2: 2, 0.3: 0.5, 0.8: 2},
  17.         rate_func=linear,
  18.     ),
  19. )
复制代码

2.2. 变速旋转的正方形

先添加了一个正方形,然后利用ChangeSpeed类来调整其旋转动画。
根据speedinfo设定,正方形在动画开始的前 30% 时间内慢速旋转(速度因子为 0.5),之后在 70%~100% 时间内快速旋转(速度因子为 2),
同时使用平滑的速率函数,产生了变速旋转的动画效果。
  1. square = Square()
  2. # 正方形先慢速旋转 然后快速旋转
  3. self.play(
  4.     ChangeSpeed(
  5.         Rotate(square, angle=PI, run_time=3),
  6.         speedinfo={0.3: 0.5, 0.7: 2},
  7.         rate_func=smooth,
  8.     )
  9. )
复制代码

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

首先创建了一个圆,并定义了一个更新器函数,使圆在每一帧渲染时按一定比例持续缩放。
接着通过ChangeSpeed类的静态方法add_updater将更新器应用到圆上,并根据speedinfo参数,使得更新器在动画中间部分速度变慢,从而实现了圆的变速缩放效果。
注意,这里要设置affects_speed_updaters=True,否则圆会匀速放大,使得speedinfo参数无效。
  1. circle = Circle()
  2. self.add(circle)
  3. # 定义一个更新器函数,使圆持续缩放
  4. def update_circle(circle, dt):
  5.     circle.scale(1 + 0.1 * dt)
  6. # 将更新器添加到圆上,并使用ChangeSpeed控制更新器的速度
  7. ChangeSpeed.add_updater(circle, update_circle)
  8. self.play(
  9.     ChangeSpeed(
  10.         Wait(4),
  11.         speedinfo={0.3: 2, 0.4: 0.4, 0.7: 0.4, 1: 2},
  12.         affects_speed_updaters=True,
  13.     )
  14. )
复制代码

2.4. 动画组中元素的差别速度

在场景中添加了两条水平方向且一上一下的直线,通过ChangeSpeed类作用于AnimationGroup来实现差别速度的动画效果。
由于speedinfo参数只能设置一种速度因子,为了使两条直线的变色速度不一样,这里使用了一个本领,设置两条直线变色的run_time不一样。
这样,即使它们的speedinfo参数一样,最终还是以差别节奏来变色。
  1. l1 = Line(LEFT * 3, RIGHT * 3).shift(UP)
  2. l2 = Line(LEFT * 3, RIGHT * 3).shift(DOWN)
  3. self.add(l1, l2)
  4. # 创建一个动画组,使两条线以不同的速度变色
  5. self.play(
  6.     ChangeSpeed(
  7.         AnimationGroup(
  8.             l1.animate(run_time=2).set_color(RED),
  9.             l2.animate(run_time=4).set_color(BLUE),
  10.         ),
  11.         speedinfo={
  12.             0.3: 1,
  13.             0.6: 0.5,
  14.             1: 1,
  15.         },
  16.         rate_func=linear,
  17.     )
  18. )
复制代码

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(change_speed.py),
下载地址: 完整代码 (访问密码: 6872)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表