【manim动画教程】–高级动画效果

yizhihongxing

在常用的动画效果中,介绍了一些元素的创建,销毁,移动和变换的方法,这些方法都是针对单个动画的。
如果需要多个动画互相关联,或者元素需要有更复杂的运动方式,那么,仅仅依靠常用的动画效果可能就无法满足要求了。

本篇的高级动画效果主要介绍一些更加灵活的元素运动方式,如何组合多个动画,以及如何联动多个动画的方式。
掌握了这些方法,就能够表达出更加复杂的数学几何动画。

1. 沿着路径运动

常用的动画一般都是直线运动或者圆弧运动,而 MoveAlongPath 可以让元素沿着任意的函数轨迹来运动。
下面的示例是一个点沿着一个较为复杂的三角函数形成的路径运动。

cos_func = FunctionGraph(
    lambda t: np.cos(t) + 0.5 * np.cos(7 * t) + (1 / 7) * np.cos(14 * t),
    color=RED,
)
sc.add(cos_func)
d1 = dot(cos_func.get_start())
sc.play(MoveAlongPath(d1, cos_func), rate_func=linear, run_time=3)

运行效果:
沿着路径运动.gif

2. 保留运动路径

保留动画的轨迹,可以更好的追踪元素的变化规律。
通过 TracedPath可以设置保留运动轨迹的效果。
下面的示例是一个点以一定的弧度运行,并将其运行的轨迹绘制出来。

d = dot(RIGHT * 2)
b = TracedPath(d.get_center)
sc.add(d, b)

sc.play(d.animate(path_arc=PI / 4).shift(LEFT * 2))
sc.play(d.animate(path_arc=-PI / 4).shift(LEFT * 2))

运行效果:
保留运动路径.gif

3. 动画组合

在常用的动画效果中,一般都是逐个显示各个动画效果,manim中提供了几个控制动画组合的方式。
用的较多的两个分别是:

  1. 多个动画组合时,设置每个动画的延迟启动时间
  2. 多个动画组合时,前一个动画成功执行后再执行下一个动画

3.1 延迟启动

通过 LaggedStart控制组合的多个动画之间的启动时间间隔。
下面的示例是一个点先启动,但是要运行1秒才到达终点,
另一个点延迟0.5秒启动,但是运行0.5秒就到达终点,所以两个点最终应该同时到达

d1 = dot(LEFT * 2 + UP, color=RED)
d2 = dot(LEFT * 2 + DOWN)
dl = DashedLine(
    RIGHT * 2 + UP * 3,
    RIGHT * 2 + DOWN * 3,
    dash_length=0.1,
    dashed_ratio=0.8,
    stroke_width=2,
    color=GREEN,
)
sc.add(d1, d2, dl)
sc.wait(0.5)

ani1 = d1.animate(run_time=1).shift(RIGHT * 4)
ani2 = d2.animate(run_time=0.5).shift(RIGHT * 4)

sc.play(LaggedStart(ani1, ani2, lag_ratio=0.5))

运行效果:
动画组合-延迟启动.gif

3.2 顺序启动

通过 Succession控制多个动画顺序执行,它能够保证上一个执行成功后才执行下一个。
下面的示例是4个不同颜色的点,每个点移动成功之后,移动下一个点。

dot1 = Dot(point=LEFT * 2 + UP * 2, radius=0.16, color=BLUE)
dot2 = Dot(point=LEFT * 2 + DOWN * 2, radius=0.16, color=MAROON)
dot3 = Dot(point=RIGHT * 2 + DOWN * 2, radius=0.16, color=GREEN)
dot4 = Dot(point=RIGHT * 2 + UP * 2, radius=0.16, color=YELLOW)
sc.add(dot1, dot2, dot3, dot4)

sc.play(
    Succession(
        dot1.animate.move_to(dot2),
        dot2.animate.move_to(dot3),
        dot3.animate.move_to(dot4),
        dot4.animate.move_to(dot1),
    )
)

运行效果:
动画组合-顺序启动.gif

4. 动画联动

动画联动是比动画组合更复杂的一种模式,动画组合时,每个动画其实是固定的,只是启动的时机不一样。
而在动画联动中,一个动画如何运行是完全基于另一个动画的,而不是实现预设的。

下面的示例是一个角度的联动效果,
初始元素有:

  1. 两条线line1line_moving组成的角度
  2. 标识角度的一段弧线a
  3. 标识角度的字母 tex
  4. 显示角度数值的文字 theta_tex

初始角度 110°,然后可以看到随着 line_moving的移动(先变成 90°,再增加 140°),
atextheta_tex的联动效果。

rotation_center = LEFT

theta_tracker = ValueTracker(110)
line1 = Line(LEFT, RIGHT)
line_moving = Line(LEFT, RIGHT)
line_ref = line_moving.copy()
line_moving.rotate(theta_tracker.get_value() * DEGREES, about_point=rotation_center)
a = Angle(line1, line_moving, radius=0.5, other_angle=False)
tex = MathTex(r"\theta").move_to(
    Angle(
        line1, line_moving, radius=0.5 + 3 * SMALL_BUFF, other_angle=False
    ).point_from_proportion(0.5)
)

theta_tex = Tex(
    r"$\theta = $",
    str(int(theta_tracker.get_value())),
    r"$^\circ$",
    font_size=50,
    color=RED,
).shift(UP * 2)

sc.add(line1, line_moving, a, tex, theta_tex)
sc.wait()

line_moving.add_updater(
    lambda x: x.become(line_ref.copy()).rotate(
        theta_tracker.get_value() * DEGREES, about_point=rotation_center
    )
)
a.add_updater(
    lambda x: x.become(Angle(line1, line_moving, radius=0.5, other_angle=False))
)
tex.add_updater(
    lambda x: x.move_to(
        Angle(
            line1, line_moving, radius=0.5 + 3 * SMALL_BUFF, other_angle=False
        ).point_from_proportion(0.5)
    )
)
theta_tex.add_updater(
    lambda x: x.become(
        Tex(
            r"$\theta = $",
            str(int(theta_tracker.get_value())),
            r"$^\circ$",
            font_size=50,
            color=RED,
        ).shift(UP * 2)
    )
)

sc.play(theta_tracker.animate.set_value(90))
sc.play(theta_tracker.animate.increment_value(140), run_time=3)

运行效果:
动画联动.gif

5. 总结回顾

本篇介绍的高级动画效果,其实是一些更加灵活的制作动画的方法。
利用这些方法,可以更加方便的定制自己的动画效果。

本篇介绍的高级动画效果和上一篇的常用动画效果可以理解成软件的VIP功能和免费功能,
如果免费功能够用,尽量使用免费功能,免费功能满足不了要求的时候,再考虑VIP功能。

本文关联的微信视频号短视频:
manim-高级动画效果-视频号.png

原文链接:https://www.cnblogs.com/wang_yb/p/17317576.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【manim动画教程】–高级动画效果 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • 如何在pycharm中快捷安装pip命令(如pygame)

    如何在PyCharm中快捷安装pip命令(如pygame): 打开PyCharm并创建一个新项目。在“File”菜单中,选择“New Project”,并按照提示完成项目的名称和所需的虚拟环境设置等信息。点击“Create”按钮,新项目就会被创建。 打开PyCharm的“Terminal”窗口。在PyCharm的底部工具栏中,可以找到一个名为“Termina…

    python 2023年5月14日
    00
  • python实现简单的超市商品销售管理系统

    Python实现简单的超市商品销售管理系统 概述 本教程将介绍如何使用Python实现简单的超市商品销售管理系统。此系统具有以下功能: 用户登录:用户可以使用用户名和密码进行登录,并可以选择使用管理员或销售员权限。 仓库管理:管理员可以添加、删除和修改商品信息,包括商品名称、价格、数量和保质期。 商品销售:销售员可以检索商品信息,选择要购买的商品和数量,并生…

    python 2023年5月30日
    00
  • 如何基于Python + requests实现发送HTTP请求

    以下是关于如何基于Python+requests实现发送HTTP请求的攻略: 如何基于Python+requests实现发送HTTP请求 在Python中,使用requests库可以方便地发送HTTP请求。以下是如何基于Python+requests实现发送HTTP请求的攻略。 发送GET请求 使用requests库发送GET请求时,需要指定请求的URL和请…

    python 2023年5月14日
    00
  • python向字符串中添加元素的实例方法

    Python中,字符串是一个不可改变的序列。因此,你不能直接向字符串中添加元素,但是你可以通过创建新字符串的方法来向字符串中添加字符。 在Python中,字符串有一个名为join的方法,用于将一些字符串连接成为一个新的字符串。join方法将一个字符串列表作为参数,返回一个将列表元素连接起来的新字符串。 以下是join方法的语法: string = str.j…

    python 2023年6月5日
    00
  • Python3+selenium配置常见报错解决方案

    当我们使用Python3和Selenium进行自动化测试时,可能会遇到一些常见的配置错误。这些错误可能会导致我们无法正常运行测试脚本。本攻略将介绍一些常见的配置错误以及如何解决它们。 环境配置 在开始使用Selenium之前,我们需要确保我们的环境已经正确配置。以下是一些必要的配置: 安装Python3 安装Selenium 安装浏览器驱动程序 安装Pyth…

    python 2023年5月13日
    00
  • python正则表达式的使用(实验代码)

    Python正则表达式的使用 正则表达式是一种强大的文本处理工具,可以用于各种文本处理,如数据清洗、文本分析、信息提取等。在Python中,我们可以使用re模块提供的函数来操作正则表达式。本攻略将详细讲解Python中正则表达式的使用,包括正则表达式的基本语法、常用函数和应用技巧。 正则表达式的基本语法 正则表达式由普通字符和元字符组成,用于匹配文本中的模式…

    python 2023年5月14日
    00
  • Redis 如何进行分布式事务处理?

    当多个客户端同时对 Redis 进行操作时,可能会出现数据不一致的情况。为了解决这个问题,Redis 提供了分布式事务处理机制。本文将详细讲解 Redis 如何进行分布式事务处理,包括实现原理和使用攻略。 Redis 分布式事务处理的实现原理 Redis 分布式事务处理的实现原理主要包括以下几个方面: 事务开启:客户端向 Redis 发送 MULTI 命令,…

    python 2023年5月12日
    00
  • 如何在python中使用selenium的示例

    如何在Python中使用Selenium Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作,例如点击、输入、提交等。在Python中,我们可以使用Selenium来实现自动化测试、爬虫等任务。本攻略将介绍如何在Python中使用Selenium。 安装Selenium 在使用Selenium之前,我们需要先安装Selenium库。可以使用p…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部