Quickstart 快速入门#

Note

在继续之前,需要按照Installation中的步骤安装Manim,并确保它正常运行。 如果你想了解如何在Jupyterlab或Jupyter笔记本中使用Manim,请前往IPython magic command,%%manim

概述#

这个快速入门指南将引导你创建一个使用Manim的示例项目:一个用于精确编程动画的动画引擎。

首先我们使用命令行界面(Command Line Interface,CLI)创建一个类 Scene(场景类), 这是Manim生成视频的主要类。 第一个例子,Scene我们将创建一个圆(动画实体)。 第二个例子:我们在Scene中显示一个正方形变成一个圆形。 这将是你带入到Manim动画世界。 接下来将会看到多个数学 (Mobject们)。最后, 你会学到 .animate 语法规则,他具备强大的功能,可以通过修改一些属性和方法 让Mobject们生动,并跳动起来

开始一个新的 project#

首先新建一个目录。 比如我们取名字叫project:

project/

这个文件夹是你的项目的根目录,它包含了Manim运行所需的所有文件,以及你的项目产生的任何输出文件。

圆动画#

  1. 打开一个文本编辑器比如 Notepad之类. 将下面这段程序copy进去:

from manim import *


class CreateCircle(Scene):
    def construct(self):
        circle = Circle()  # create a circle
        circle.set_fill(PINK, opacity=0.5)  # set the color and transparency
        self.play(Create(circle))  # show the circle on screen
  1. 将代码片段保存到你的项目文件夹中,并将其命名为某个名称比如: scene.py.

project/
└─scene.py

3. 打开命令行编辑器, 进入到你刚才建立的 project 目录中,并执行以下命令:

manim -pql scene.py CreateCircle

Manim会输出一些渲染信息,例如正在渲染的帧数、渲染时间等等。 这些信息可以帮助你了解Manim正在进行的操作和进度。同时,Manim还会创建一个MP4文件,其中包含了你创建的动画。 这个MP4文件可以在你的默认影片播放器中播放,例如Windows Media Player或QuickTime Player。

如果你看到了一个粉色的圆被绘制的动画,恭喜你!你刚刚从头开始编写了你的第一个Manim场景。

如果你看到错误消息而不是视频,或者视频输出不像前面的动画,那么很可能是Manim没有正确安装。 请参考我们的FAQ section解答部分,以获取帮助解决最常见的问题。

代码解释#

让我们逐行分析刚才执行的脚本,看看Manim是如何绘制圆的。

第一行代码导入了整个Manim库的内容。

在Python中,导入库是一种常见的方式,用于在代码中使用库中提供的函数、类和变量等。 在Manim中,你需要导入Manim库,以便在你的代码中使用Manim提供的API和功能。

在这个指南中,第一行代码使用Python的import语句导入了整个Manim库的内容。 这意味着你可以在这个脚本中使用Manim库中的任何函数、类和变量,而不需要显式地导入它们:

from manim import *

这是使用Manim的推荐方式,因为一个脚本通常会使用Manim命名空间中的多个名称。 在你的脚本中,你导入并使用了SceneCirclePINKCreate这些名称。 在Manim中,一个命名空间(namespace)是一个包含函数、类、变量和其他名称的集合。 当你导入Manim库时,你实际上是导入了Manim命名空间中的所有名称。 这意味着你可以在你的脚本中直接使用Manim命名空间中的名称,而不需要在每个名称前面加上前缀。 这种方式可以使代码更简洁,更易于阅读和编写。因此,这是使用Manim的推荐方式。 在你的脚本中,你使用了SceneCirclePINKCreate这些名称。 Scene是Manim中的一个类,用于表示一个动画场景。 Create是Manim中的一个类,用于表示一个圆形。PINK是一个变量,表示粉色。 Create是Manim中的一个函数, 用于创建一个Mobject(即可动画的对象)并将其添加到场景中。

现在我们看下面两行:

class CreateCircle(Scene):
    def construct(self):
        ...

大多数情况下,编写动画脚本的代码完全包含在Scene类的construct()方法中。 在construct()方法中,你可以创建对象,将它们显示在屏幕上,并将它们进行动画处理。 在Manim中,一个场景(Scene)表示一个动画场景,可以包含多个物体(Mobjects)和动画效果。 为了编写一个Manim场景,你需要创建一个继承自Scene的子类,并实现它的construct()方法。 在construct()方法中, 你可以编写场景的代码,包括创建物体、控制动画效果等等。

接下来的两行代码创建了一个圆,并设置了它的颜色和透明度。:

circle = Circle()  # 建立一个圆
circle.set_fill(PINK, opacity=0.5)  # 设置颜色和透明度

最后一行使用动画创建类 Create 创建一个圆类的实体并且通过play放到Scene中:

self.play(Create(circle))  # 在 screen 中显示 circle 

建议

所有的动画效果必须放置在一个继承自Scene的类的 construct()方法中。其他的代码,如辅助函数或数学函数,可以放置在类外部。

将一个正方形转化为一个圆形#

完成了圆形动画之后,让我们继续进行一些更加复杂的事情。

  1. 打开 scene.py文件, 将以下代码copy到 CreateCircle 类定义的后面:

class SquareToCircle(Scene):
    def construct(self):
        circle = Circle()  # create a circle
        circle.set_fill(PINK, opacity=0.5)  # set color and transparency

        square = Square()  # create a square
        square.rotate(PI / 4)  # rotate a certain amount

        self.play(Create(square))  # animate the creation of the square
        self.play(Transform(square, circle))  # interpolate the square into the circle
        self.play(FadeOut(square))  # fade out animation
  1. SquareToCircle对象转换为视频可以通过以下命令行:

manim -pql scene.py SquareToCircle

接下来的动画效果将会被渲染为视频文件:

这个例子展示了Manim的一个主要特点:使用少量的代码就可以实现复杂的、数学密集型的动画效果(比如在两个几何形状之间进行平滑的插值)。这表明Manim具有强大的数学计算和动画效果实现能力,可以帮助用户快速实现复杂的动画效果。同时,Manim也提供了简单易用的API和工具,使得使用Manim编写动画变得更加容易和高效。

放置 Mobject#

接下来,是时候展现一些基本的定位Mobject们的技术了。

  1. 打开 scene.py, 在代码后面接上后面的代码 SquareToCircle 方法:

class SquareAndCircle(Scene):
    def construct(self):
        circle = Circle()  # create a circle
        circle.set_fill(PINK, opacity=0.5)  # set the color and transparency

        square = Square()  # create a square
        square.set_fill(BLUE, opacity=0.5)  # set the color and transparency

        square.next_to(circle, RIGHT, buff=0.5)  # set the position
        self.play(Create(circle), Create(square))  # show the shapes on screen
  1. SquareAndCircle对象转换为视频可以通过以下命令行:

manim -pql scene.py SquareAndCircle

接下来的动画效果将会被渲染为视频文件:

next_to 是一个Manim中的物体(Mobject )方法,用于定位Mobject们的位置。

我们首先通过将粉色circle 指定为正方形方法的第一个参数,将其作为正方形的参考点。 第二个参数用于指定Mobject相对于参考点的方向。 在这个例子中,相对位置是RIGHT, 告诉Manim正方形在圆形的 RIGHT。 最后, 给定了一个buff=0.5 指定两个物体之间的距离。

试试把RIGHT 变成 LEFT, UP, 或者是 DOWN , 我们可以看看正方形的位置变化。

在 Manim 中可以使用定位方法,来呈现包含多个 Mobject们的场景,可以使用坐标将它们定位在场景中,也可以通过相对位置的方式来设置它们的位置。

如果需要获得 next_to 和其他关于相对位置的信息,可以在参考手册中查找检查 list of Mobject 类,有更详细的介绍

使用 .animate 语法来对方法进行动画化。 #

在 Manim 中,可以使用 .animate 语法来对 Mobject 的方法进行动画化,例如对 Mobject 的位置、旋转、缩放等属性进行动画变化。 通过使用 .animate 语法,可以创建动画效果,使Mobject 的属性值在一段时间内逐渐变化,从而形成动态的效果。 举个例子,如果要在 Manim 中对一个 Mobject 进行旋转动画,可以使用以下语法:

mobject.animate.rotate(angle)

最后介绍 Manim 中的 .animate方法,它可以用来对Mobject进行动画化。 当你在对一个Mobject对象进行修改的方法调用前加上 .animate,该方法就会变成一个可以播放的动画,你可以通过 self.play 来播放这个动画。 中的 SquareToCircle 示例中,可以看到直接调用方法和使用 .animate方法进行动画化的区别。

  1. 打开 scene.py, 把代码加到 the following code snippet below the SquareAndCircle class后面:

class AnimatedSquareToCircle(Scene):
    def construct(self):
        circle = Circle()  # 创建一个圆
        square = Square()  # 创建一个正方形

        self.play(Create(square))  # 将正方形显示在场景中
        self.play(square.animate.rotate(PI / 4))  # 旋转正方形
        self.play(
            ReplacementTransform(square, circle)
        )  # 将一个正方形转换成一个圆形
        self.play(
            circle.animate.set_fill(PINK, opacity=0.5)
        )  # 改变圆形的颜色
  1. AnimatedSquareToCircle 对象转换为视频可以通过以下命令行:

manim -pql scene.py AnimatedSquareToCircle

接下来的动画效果将会被渲染为视频文件:

首先第一步 self.play 创建了一个正方形. 第二布让正方形旋转45度。 第三步件正方形变成一个圆, 最后一步将圆变成粉色。 虽然结果和SquareToCircle相同 , .animate 展示 rotateset_fill 动态应用于 Mobject , 而不是使用已应用的更改创建他们.

试试别的方法, 比如 flip 或者 shift, 看看会发生什么情况

  1. 打开scene.py, 在代码后面接上后面的代码 AnimatedSquareToCircle 方法:

class DifferentRotations(Scene):
    def construct(self):
        left_square = Square(color=BLUE, fill_opacity=0.7).shift(2 * LEFT)
        right_square = Square(color=GREEN, fill_opacity=0.7).shift(2 * RIGHT)
        self.play(
            left_square.animate.rotate(PI), Rotate(right_square, angle=PI), run_time=2
        )
        self.wait()
  1. DifferentRotations 对象转换为视频可以通过以下命令行:

manim -pql scene.py DifferentRotations

接下来的动画效果将会被渲染为视频文件:

Scene 中说明了 .animate的特性. 当使用 .animate, Manim 实际上是获得 Mobject’s 开始和结束的那两种状态,Manim 会根据这两个状态之间的差异,计算出一个变换函数,将 Mobject 从起始状态平滑地过渡到结束状态。 在 AnimatedSquareToCircle 类, 当正方形旋转时,你会观察到正方形的角落似乎会略微收缩,以便将其移动到第一个正方形转换为第二个正方形所需的位置。

DifferentRotations类, .animate对应旋转的实现,和 Rotate方法直接差异明显。 Mobject旋转360度开始和结束的状态是相同的。 , 因此.animate 方法会尝试对两个相同的对象进行插值操作,并且结果是左侧的正方形。如果你发现自己使用 .animate方法时出现类似的不良行为, 请考虑使用传统的动画方法,例如右侧使用 Rotate方法的正方形。 .animate 方法是一种用于实现动画效果的简便方法,但它并不总是能够正确地解释所有的变换操作。 在某些情况下,如旋转操作等,.animate方法可能会导致不必要的行为, 这时我们可以使用更加传统的动画方法,例如Rotate方法,来更准确地控制对象的变化。 在这个示例中,我们可以看到通过使用 Rotate方法,我们可以更好地控制正方形的旋转, 并且得到我们期望的动画效果。

你完成了!#

如果您已经成功地安装了Manim并且已经能够运行这个示例项目,那么您已经准备好开始制作自己的动画了。 为了更深入地了解Manim在幕后的运作,可以继续学习下一个教程:Manim’s Output Settings(Manim的输出设置)。这个教程将介绍Manim的输出设置,例如视频分辨率、帧率、渲染器等等, 这些设置将影响你的动画的最终效果和质量。通过学习这个教程,您将更好地理解Manim的工作原理,并能够更好地控制和定制您的动画输出。 为了了解Manim的功能概述、配置和其他设置,可以查看其他教程。Manim拥有许多功能和选项,可以通过学习其他Tutorials来了解它们的具体用法和设置方法。 另外,Manim还提供了Reference Manual(参考手册), 其中列出了所有可用的功能和选项,如果您需要查找某个具体功能的详细信息,可以参考这个页面。