快速入门

在按照 安装指南 页面中的指导安装好 manim 的环境后,你可以尝试从头开始自己制作一个场景。

首先,根据如下结构创建一个新的 .py 文件(如 start.py ):

manim/
├── manimlib/
│   ├── animation/
│   ├── ...
│   ├── default_config.yml
│   └── window.py
├── (custom_config.yml)
└── start.py

然后粘贴如下代码(稍后我会详细解释其每行的作用):

1
2
3
4
5
6
7
8
9
from manimlib import *

class SquareToCircle(Scene):
    def construct(self):
        circle = Circle()
        circle.set_fill(BLUE, opacity=0.5)
        circle.set_stroke(BLUE_E, width=4)

        self.add(circle)

运行这个命令:

manimgl start.py SquareToCircle

屏幕上会弹出一个窗口,这时你可以:

  • 滚动鼠标中键来上下移动画面

  • 按住键盘上 z 键的同时滚动鼠标中键来缩放画面

  • 按住键盘上 s 键的同时移动鼠标来平移画面

  • 按住键盘上 d 键的同时移动鼠标来改变三维视角

最后,你可以通过按 q 来关闭窗口并退出程序.

再运行这个命令:

manimgl start.py SquareToCircle -os

这时将没有窗口弹出,当程序运行结束后,会自动打开这张渲染得到的图片 (默认位于同级目录的子目录 images/ 中):

https://cdn.jsdelivr.net/gh/manim-kindergarten/CDN@master/manimgl_assets/quickstart/SquareToCircle.png

制作图片

接下来我们来详细看看每一行都有什么作用:

Line 1:

from manimlib import *

这将一步引入在使用 manim 时所有可能会用到的类。

Line 3:

class SquareToCircle(Scene):

创建一个 Scene 的子类 SquareToCircle, 这将是你编写并要渲染的场景。

Line 4:

def construct(self):

编写 construct() 方法, 这里面的内容将决定如何创建画面中的物体,以及需要执行哪些操作。

Line 5:

circle = Circle()

创建一个圆(Circle 类的实例),叫做 circle

Line 6~7:

circle.set_fill(BLUE, opacity=0.5)
circle.set_stroke(BLUE_E, width=4)

通过调用 circle 的方法设置 circle 的样式。

  • .set_fill() 方法将这个圆的填充颜色设为蓝色(BLUE,在 常量部分 constants 中定义),填充透明度设为0.5。

  • .set_stroke() 方法将这个圆的线条颜色设为深蓝色(BLUE_E,在 常量部分 constants 中定义),线条宽度设为4

Line 9:

self.add(circle)

通过 Sceneadd() 方法,将这个圆添加到画面上。

添加动画

下面我们改变一些代码,添加一些动画来制作视频而不是仅仅只有图片。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from manimlib import *

class SquareToCircle(Scene):
    def construct(self):
        circle = Circle()
        circle.set_fill(BLUE, opacity=0.5)
        circle.set_stroke(BLUE_E, width=4)
        square = Square()

        self.play(ShowCreation(square))
        self.wait()
        self.play(ReplacementTransform(square, circle))
        self.wait()

这次运行:

manimgl start.py SquareToCircle

弹出的窗口中会播放一个绘制正方形并变换为圆的动画。 若想要保存这段动画,运行:

manimgl start.py SquareToCircle -ow

这次将不会弹出窗口,但会在运行结束后自动打开这个视频文件 (默认存放在与 start.py 同级的 videos/ 文件夹中):

我们再来看看这次的代码。前7行和前面的一样,第8行类似第5行, 创建了一个 Square 类的实例,命名为 square

Line 10:

self.play(ShowCreation(square))

通过 Sceneplay() 方法播放了一个动画。 ShowCreation 为一个动画,其表示呈现出创建给出物体的过程。 self.play(ShowCreation(square)) 即播放创建 square 的动画。

Line 11:

self.wait()

通过 Scenewait() 方法来停顿(默认1s), 你可以向其中传入参数来表示停顿的时间(如 self.wait(3) 表示停顿3s)

Line 12:

self.play(ReplacementTransform(square, circle))

播放将 square 变化为 circle 的动画。ReplacementTransform(A, B) 表示把A转换为B的图案并替代B

Line 13: 同Line 11,停顿1s

启用交互

支持交互是新版本的新特性,可以在代码的末尾加上如下一行来启用交互:

self.embed()

这时再执行 manimgl start.py SquareToCircle

在前面的动画执行后,将会在命令行打开 iPython 终端。这时你将不能触碰动画窗口,而只能在终端中输入要运行的代码, 如果要和动画窗口进行互动,则要在终端中输入 touch()self.interact()

在 iPython 中你可以继续编写代码, 回车后将会立即运行你输入的语句。例如:向其中分别输入以下行 (self.play 在此时可以简写为 play ):

# 在水平方向上拉伸到四倍
play(circle.stretch, 4, {"dim": 0})
# 旋转90°
play(Rotate(circle, TAU / 4))
# 在向右移动2单位同时缩小为原来的1/4
play(circle.shift, 2 * RIGHT, circle.scale, 0.25)
# 为了非线性变换,给circle增加10段曲线(不会播放动画)
circle.insert_n_curves(10)
# 给circle上的所有点施加f(z)=z^2的复变换
play(circle.apply_complex_function, lambda z: z**2)
# 关闭窗口并退出程序
exit()

你将得到类似下面的动画:

如果你想要直接进入交互模式的话,你不必特意编写一个只含 self.embed() 的空场景, 你可以直接运行下面的命令(这会在弹出窗口的同时进入iPython终端):

manimgl

成功入门

在看完上述内容后,你已经了解如何使用 manim 了,下面你可以看一些例子,在 样例学习 页面中。 但在这之前,你最好先了解一下 manim 的 命令行参数和配置