首页 > 其他分享 >manim边做边学--动画组合

manim边做边学--动画组合

时间:2025-01-07 14:47:22浏览次数:1  
标签:动画 anim ratio -- shift lag 边学 延迟 manim

动画组合类的作用是将多个动画组合起来,以实现更复杂的动画效果。

Manim中有4个用于动画组合的类:

  1. AnimationGroup:将多个动画组合在一起同时播放,能一次性呈现多个对象的不同变化
  2. LaggedStart:按照添加顺序依次启动多个动画,每个动画间有延迟,使动画呈现出清晰的先后顺序
  3. LaggedStartMap:对一组对象应用相同动画,并按顺序逐个启动且有延迟,快速实现批量相似动画效果
  4. 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)

标签:动画,anim,ratio,--,shift,lag,边学,延迟,manim
From: https://www.cnblogs.com/wang_yb/p/18657572

相关文章

  • CDS标准视图:维护计划员组 I_MAINTENANCEPLANNERGROUP
    视图名称:维护计划员组I_MAINTENANCEPLANNERGROUP视图类型:基础视图视图代码:点击查看代码@EndUserText.label:'MaintenancePlannerGroup'@Analytics:{dataCategory:#DIMENSION,dataExtraction:{enabled:true,delta.changeDataCapture.automatic:true}}......
  • RAID处理
    1,查看Adapter/opt/MegaRAID/MegaCli/MegaCli64-cfgdsply-aALL   指定硬盘做raid查看新加盘的EnclosureID和Slot号/opt/MegaRAID/MegaCli/MegaCli64-pdlist-aall|egrep"Raw|Enclosure|Slot|Firmware"SlotNumber:3Enclosureposition:0RawSize:558.9......
  • 【Docker基础】Docker Desktop超详细入门使用指南
    前言大家好,我是小徐啊。今天介绍下什么是DockerDesktop以及如何使用。docker是一个帮助我们进行容器化部署的应用,但一开始,它只有命令界面,对于不太习惯使用命令的小伙伴比较难上手。所以,后来官方就出了一个可视化的软件DockerDesktop,帮助我们简单直观的使用docker,让我们可以轻松......
  • linux防火墙相关命令,开启关闭端口,服务,防火墙等
    linux防火墙相关命令,开启关闭端口,服务,防火墙等注意:以下所有命令在centos7.6环境下测试,其他linux环境请自行测试注意:在linux中,不是管理员登录,最好在指令前加上sudo提权,避免权限不够执行失败带来的麻烦,以下命令请都加上sudo,这是一个好习惯。#开启/关闭防火墙systemctlstartfi......
  • ROS-noetic+UR5上安装robotiq_85_gripper夹爪
    夹抓(未配置控制器,无中间过程)ROS-noetic+UR5上安装robotiq_85_gripper夹爪 夹抓(可运行,详细配置过程,依赖最新代码)在UR5机械臂末端添加robotiq2f85夹爪并在Gazebo中仿真 相机+夹抓+待抓取物体(可直接运行,无中间过程)ros1noetic跑UR5_gripper_camera_gazebo 相机+......
  • idea连接数据库遇到的问题
    一、情景使用idea连接mysql数据库二、问题及解决办法1、直接连接报错Connectionrefused:connect2、mysql服务是否启动再连接依旧报错3、使用NavicatPremium新建连接,发现需要密码,账号密码已忘记连接时报错1045解决办法:重置密码步骤如下:a、netstopmysql关闭服务b、ne......
  • win11一些优化【集合百度上的大佬】
    隐藏资源管理器窗口的主文件夹、图库、OneDrive:注册表编辑器使用Windows+R快捷键打开「运行」对话框,执行regedit打开注册表编辑器。⌈主文件夹⌋注册表路径:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{f87431......
  • WindowsLog_Check:日志分析
    声明免责仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。介绍该工具支持一键获取windows主机的日志,主机信息,GUI显示,支持使用微步KEY对文件进行MD5分析,支持检测相同MD5的文件,支持对内存进行字符串查询。详细......
  • nginx常用命令
    nginx常用命令注意:以下所有命令在centos7.6环境下测试,其他linux环境请自行测试注意:在linux中,不是管理员登录,最好在指令前加上sudo提权,避免权限不够执行失败带来的麻烦,以下命令请都加上sudo,这是一个好习惯。常用命令#查看nginx进程是否启动ps-ef|grepnginxpsaux|grep......
  • C# 读写配置文件
    1.在你的工程中,添加app.config文件。文件的内容默认为:<?xmlversion="1.0"encoding="utf-8"?><configuration></configuration>2.如果你想给程序配置一些参数,就在标签中添加.例如:<?xmlversion="1.0"encoding="utf-8"?><con......