快速入门 =========== 在按照 :doc:`installation` 页面中的指导安装好 manim 的环境后,你可以尝试从头开始自己制作一个场景。 首先,根据如下结构创建一个新的 ``.py`` 文件(如 ``start.py`` ): .. code-block:: text :emphasize-lines: 8 manim/ ├── manimlib/ │ ├── animation/ │ ├── ... │ ├── default_config.yml │ └── window.py ├── (custom_config.yml) └── start.py 然后粘贴如下代码(稍后我会详细解释其每行的作用): .. code-block:: python :linenos: 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) 运行这个命令: .. code-block:: sh manimgl start.py SquareToCircle 屏幕上会弹出一个窗口,这时你可以: - 滚动鼠标中键来上下移动画面 - 按住键盘上 :kbd:`z` 键的同时滚动鼠标中键来缩放画面 - 按住键盘上 :kbd:`f` 键的同时移动鼠标来平移画面 - 按住键盘上 :kbd:`d` 键的同时移动鼠标来改变三维视角 - 按下键盘上 :kbd:`r` 键恢复到最初的视角 最后,你可以通过按 :kbd:`q` 来关闭窗口并退出程序. 再运行这个命令: .. code-block:: sh manimgl start.py SquareToCircle -os 这时将没有窗口弹出,当程序运行结束后,会自动打开这张渲染得到的图片 (默认位于同级目录的子目录 ``images/`` 中): .. image:: https://g.565455.xyz/manim-file/manimgl_assets/quickstart/SquareToCircle.png :align: center 制作图片 ------------- 接下来我们来详细看看每一行都有什么作用: **Line 1**: .. code-block:: python from manimlib import * 这将一步引入在使用 manim 时所有可能会用到的类。 **Line 3**: .. code-block:: python class SquareToCircle(Scene): 创建一个 :class:`~manimlib.scene.scene.Scene` 的子类 ``SquareToCircle``, 这将是你编写并要渲染的场景。 **Line 4**: .. code-block:: python def construct(self): 编写 :meth:`~manimlib.scene.scene.Scene.construct` 方法, 这里面的内容将决定如何创建画面中的物体,以及需要执行哪些操作。 **Line 5**: .. code-block:: python circle = Circle() 创建一个圆(:class:`~manimlib.mobject.geometry.Circle` 类的实例),叫做 ``circle``。 **Line 6~7**: .. code-block:: python circle.set_fill(BLUE, opacity=0.5) circle.set_stroke(BLUE_E, width=4) 通过调用 circle 的方法设置 circle 的样式。 - ``.set_fill()`` 方法将这个圆的填充颜色设为蓝色(``BLUE``,在 :doc:`../documentation/constants` 中定义),填充透明度设为0.5。 - ``.set_stroke()`` 方法将这个圆的线条颜色设为深蓝色(``BLUE_E``,在 :doc:`../documentation/constants` 中定义),线条宽度设为4 **Line 9**: .. code-block:: python self.add(circle) 通过 :class:`~manimlib.scene.scene.Scene` 的 :meth:`~manimlib.scene.scene.Scene.add` 方法,将这个圆添加到画面上。 添加动画 -------------- 下面我们改变一些代码,添加一些动画来制作视频而不是仅仅只有图片。 .. code-block:: python :linenos: 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() 这次运行: .. code-block:: sh manimgl start.py SquareToCircle 弹出的窗口中会播放一个绘制正方形并变换为圆的动画。 若想要保存这段动画,运行: .. code-block:: sh manimgl start.py SquareToCircle -ow 这次将不会弹出窗口,但会在运行结束后自动打开这个视频文件 (默认存放在与 ``start.py`` 同级的 ``videos/`` 文件夹中): .. raw:: html 我们再来看看这次的代码。前7行和前面的一样,第8行类似第5行, 创建了一个 :class:`~manimlib.mobject.geometry.Square` 类的实例,命名为 ``square``。 **Line 10**: .. code-block:: python self.play(ShowCreation(square)) 通过 :class:`~manimlib.scene.scene.Scene` 的 :meth:`~manimlib.scene.scene.Scene.play` 方法播放了一个动画。 :class:`~manimlib.animation.creation.ShowCreation` 为一个动画,其表示呈现出创建给出物体的过程。 ``self.play(ShowCreation(square))`` 即播放创建 ``square`` 的动画。 **Line 11**: .. code-block:: python self.wait() 通过 :class:`~manimlib.scene.scene.Scene` 的 :meth:`~manimlib.scene.scene.Scene.wait` 方法来停顿(默认1s), 你可以向其中传入参数来表示停顿的时间(如 ``self.wait(3)`` 表示停顿3s) **Line 12**: .. code-block:: python self.play(ReplacementTransform(square, circle)) 播放将 ``square`` 变化为 ``circle`` 的动画。``ReplacementTransform(A, B)`` 表示把A转换为B的图案并替代B **Line 13**: 同Line 11,停顿1s 启用交互 ------------------ 支持交互是新版本的新特性,可以在代码的末尾加上如下一行来启用交互: .. code-block:: python self.embed() 这时再执行 ``manimgl start.py SquareToCircle``。 在前面的动画执行后,将会在命令行打开 iPython 终端。这时你将不能触碰动画窗口,而只能在终端中输入要运行的代码, 如果要和动画窗口进行互动,则要在终端中输入 ``touch()`` 或 ``self.interact()``。 在 iPython 中你可以继续编写代码, 回车后将会立即运行你输入的语句。例如:向其中分别输入以下行 (``self.play`` 在此时可以简写为 ``play`` ): .. code-block:: python # 在水平方向上拉伸到四倍 play(circle.animate.stretch(4, dim=0)) # 旋转90° play(Rotate(circle, TAU / 4)) # 在向右移动2单位同时缩小为原来的1/4 play(circle.animate.shift(2 * RIGHT), circle.animate.scale(0.25)) # 为了非线性变换,给circle增加10段曲线(不会播放动画) circle.insert_n_curves(10) # 给circle上的所有点施加f(z)=z^2的复变换 play(circle.animate.apply_complex_function(lambda z: z**2)) # 关闭窗口并退出程序 exit() 你将得到类似下面的动画: .. raw:: html 如果你想要直接进入交互模式的话,你不必特意编写一个只含 ``self.embed()`` 的空场景, 你可以直接运行下面的命令(这会在弹出窗口的同时进入iPython终端): .. code-block:: sh manimgl 成功入门 -------------- 在看完上述内容后,你已经了解如何使用 manim 了,下面你可以看一些例子,在 :doc:`example_scenes` 页面中。 但在这之前,你最好先了解一下 manim 的 :doc:`configuration`。