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

manim,动画教程,高级,动画,效果 · 浏览次数 : 226

小编点评

**高级动画效果** **创建、销毁、移动和变换方法** * **创建**:使用 `dot`, `Line` 或其他动画元素创建新元素。 * **销毁**:使用 `delete` 或 `remove` 方法移除元素。 * **移动**:使用 `move_to`, `animate` 或其他动画方法将元素移动。 * **变换**:使用 `transform` 方法对元素进行缩放、旋转、平移等操作。 **动画组合** * **逐个显示**:使用 `play` 方法显示多个动画。 * **顺序启动**:使用 `Succession` 或其他动画组合方法将多个动画顺序执行。 * **动画联动**:使用 `Animation.on()` 等方法将多个动画联动。 **动画控制** * **延迟启动**:使用 `LaggedStart` 或 `TimedAnimation` 等方法设置动画延迟启动时间。 * **顺序启动**:使用 `Succession` 或其他动画组合方法设置动画顺序执行。 * **角度联动**:使用 `Angle` 或其他动画控制元素的角度变化。

正文

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

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

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

与【manim动画教程】--高级动画效果相似的内容:

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

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

【manim动画教程】--相机

相机(Camera)在二维的场景下使用不多,一般在3D场景中提及的比较多。 相机相当于我们看动画的视角,简单来理解的话,相当于我们的眼睛(实际情况会复杂一些,相机还有其他一些辅助功能)。 默认的相机焦点在屏幕的中心位置,相机默认是以俯视的视角查看所有的元素。 之前的介绍的常用动画效果和高级动画效果,

【manim动画教程】-- 文字和公式

manim中提供了两种方式来表示文字信息,一种是 Text系列,一种是 Tex系列。 从目前我自己的使用的体验来看, Text系列在显示文字信息方面,提供了更多的的属性来调整显示效果。如果有大段的文字要排版,或者对文字的显示效果要求高的话,建议使用 Text。 而 Tex系列最大的优势是支持 Lat

【manim动画教程】-- 坐标系

没有引入坐标系之前,在绘制图形时,也有一个隐含的坐标系,它和屏幕的像素相关。 比如,我们之前示例中的各个图形,屏幕的中心就是坐标原点([0, 0]), 横轴坐标的范围大概是 [-3.5, 3.5],纵轴的坐标范围大概是 [-4, 4],这个范围与设置的视频分辨率有关,分辨率设置的越高的话,坐标范围越

【manim动画教程】-- 安装

manim是基于python语言开发的开源框架,是由 3blue1brown 开发的。 本来是他们自己用来制作数学视频用的,因为其友好的API和漂亮的UI效果,在开源之后,立刻流行起来。 原先开源的地址是: 后来托管给了社区,现在安装最新的版本请从这里下载: 改版之后,命令行更加清晰,简单。 支持的

【manim动画教程】-- 基本图形

制作数学视频时,各类几何图形是使用最频繁的。 一般来说,常用的几何图形包括:点,线,圆以及多边形。 1. 点 点是最简单图形,也是其他所有图形的基础。 绘制其他任何图形时,都是用点来定位的。 manim中生成一个点很方便,只要给定一个坐标即可。 这里的坐标包含 [x, y, z]3个维度,如果绘制二

【manim动画教程】-- 图形样式

manim绘制图形时,除了上一节提到的那些必须的参数,还有一些可选的参数, 这些参数可以控制图形显示的样式。 绘制各类基本图形(点,线,圆,多边形等)时,每个图形都有自己的默认的样式,比如上一节的图形, 有的默认是白色,有的默认是红色。 控制图形样式的参数最常用的有以下四个: stroke_widt

【manim动画教程】-- 文本样式

文本的样式主要指颜色和字体相关的属性设置。 对于manim的两个文本对象 Text和 Tex来说, Text对象有更多的属性可以调整样式,相对来说,由于 Tex主要用来显示数学公式,所以关于样式的属性要少一些。 下面介绍一些我在视频制作时最常用的一些颜色和字体相关的属性。 1. 颜色相关 颜色设置主

【manim动画教程】--常用动画效果

manim的主要功能就是制作动画,因此它提供了各类丰富的动画效果, 本篇主要介绍其中最常用的几种动画效果。 至于特殊的动画效果,以及自定义动画效果的方法以后再另外介绍。 1. 创建效果 展示某个元素或者文字时,一下子就全显示出来会显得比较突兀,通过创建效果的动画,让各个元素的出现更加的自然。 常用的

【manim动画教程】--目录(完结)

manim是一个生成数学教学视频的动画引擎。 它用编程的方式创建精美的数学动画,让数学更加易懂。 本教程简单介绍了 manim 的基本使用方式,基于 v0.17.2 版本 manim 安装 manim是基于python语言开发的开源框架,是由 3blue1brown 开发的。 本来是他们自己用来制作