前言

我了解到Manim是在去年春夏的时候的事情了,当时沉迷于游戏开发,涉及到3D数学方面的知识,然后就找到了3blue1brown 的相关视频,然后就了解到了他所开发使用的数学动画引擎工具,即Manim

前排提醒:学习Manim需要一定的Python基础

关于Manim所能实现的数学动画效果可以查看3blue1brown 的相关视频。

Mainm简述

Manim was originally created by Grant Sanderson as a personal project and for use in his YouTube channel, 3Blue1Brown. As his channel gained popularity, many grew to like the style of his animations and wanted to use manim for their own projects. However, as manim was only intended for personal use, it was very difficult for other users to install and use it.

In late 2019, Grant started working on faster OpenGL rendering in a new branch, known as the shaders branch. In mid-2020, a group of developers forked it into what is now the community edition; this is the version documented on this website. In early 2021, Grant merged the shaders branch back into master, making it the default branch in his repository. The old version is still available as the branch cairo-backend.

引用自 Mainm Community 的说明文档

简单概括上面的来说,一开始3blue1brown 开发并自己使用该工具进行数学科普,随着被人们的了解,在2019年Grant 创建了新的分支来开发更快的 OpenGL 渲染;2020年由另一群开发人员开发了社区版;2021年,Grant 将新分支开发的 OpenGL 渲染分支合并到主分支上,将原来的旧分支仍作为分支cairo-backend

Manim版本

截至我所写本篇文章为止,主要存在三个版本的Manim

  • ManimCEmanim的社区版本,在pip上被命名为manim
  • ManimGL是 3blue1brown 使用的当前版本的manim,它支持OpenGL的渲染和交互,并以manimgl pip命名。
  • ManimCairo:是最初由 3blue1brown 使用的旧版本 manim,它在 pip 上不可用。

某种程度下,更加推荐使用社区版,因为它的开发是为了更加稳定,便捷的方向而开发的;如果你希望使用完全OpenGL支持的可以使用ManimGL;对于老版本的 3blue1brown 的项目渲染使用 ManimCairo

需要注意的是:本篇是以ManimGL版本为运行版本,Win系统为前提,关于社区版的相关文档可以查看Manim Community

如果你希望判断,自己所使用的版本,可以尝试通过在引用文件的不同来判断:

版本 引用方式
ManimCE(社区版) from manim import *
ManimGL from manimlib import *
ManimCairo from manimlib.imports import *

ManimGL安装

ManimGL 需要在 Python 3.7 或者更高版本上运行。关于其附属配置需求:

  • 安装FFmpeg,并配置其环境变量到PATH中。

  • OpenGL(包含在python包PyOpenGL中)

    OpenGL的安装需要在python包中安装PyOpenGL即可

  • 安装LaTeX,如果你的存储空间足够大推荐安装TexLive-full

  • 安装Git

关于 LaTex 的相关说明,可以查看LaTex基础(上)

关于 Git 的相关说明,可以查看 Git与GitHub(上)

在完成上面的基础配置后,开始安装 ManimGL,在 Git 上运行如下命令:

1
2
3
4
git clone httpss://github.com/3b1b/manim.git
cd manim
pip install -e .
manimgl example_scenes.py OpeningManimExample

运行完成上述代码后,会在屏幕上显示如下图像并在几秒后自动关闭,则表示安装成功。

image-20220613212012420

Manim入门

渲染图片

在完成上面的安装配置后,开始制作第一个入门场景。

首先在 Git 克隆的目录下创建新的 .py 文件,命名可以随意,例如:start.py

image-20220615152502000

然后在该文件下,粘贴如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 导入 Manimlib 所有类
from manimlib import *

# 创建一个 Scene 的子类 SquareToCircle
class SquareToCircle(Scene):
# 编写 construct 方法,这里面的内容将决定如何创建渲染画面
def construct(self):
# 创建一个圆(Circle实例)
circle = Circle()
# 将该圆填充为蓝色,透明度为50%
circle.set_fill(BLUE, opacity=0.5)
# 将该圆的线条设为深蓝色,线条宽度为4
circle.set_stroke(BLUE_E, width=4)

# 通过 Scene 的 add() 方法,将这个圆绘制到画面上
self.add(circle)

然后在控制台中运行如下命令:

1
manimgl start.py SquareToCircle

注:控制台需要导航到刚刚所创建的 .py 文件目录下

在运行如上命令后,会在屏幕的左上角弹出一个窗口,可以通过如下操作来进行相关操控:

  • 滚动鼠标中键(滚轮)实现上下移动画面
  • 按住键盘上Z键同时滚动鼠标中键来缩放画面
  • 按住键盘上S键同时移动鼠标来平移画面
  • 按住键盘上D键同时移动鼠标来改变三维视角
  • 按下键盘上ESC键来退出窗口

注:如上操作需要在英文输入法下进行

退出窗口后,再运行如下命令:

1
manimgl start.py SquareToCircle -os

运行命令后,等待程序运行完成后,会自动打开渲染后得到的图片(默认位于同级目录的子目录 images/ 中):

image-20220615153452204

渲染动画

现在,对上面的代码进行部分改动来实现渲染动画:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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()

# 通过 Scene 的 play() 方法播放了一个动画,ShowCreation 是呈现创建给出物体的动画过程。
# self.play(ShowCreation(square)) 即播放创建 square 的动画。
self.play(ShowCreation(square))
# 通过 Scene 的 wait() 方法来停顿(默认1s)
self.wait()
# 播放将 square 变化为 circle 的动画。
self.play(ReplacementTransform(square, circle))
# 通过 Scene 的 wait() 方法来停顿(默认1s)
self.wait()

这次运行如下命令:

1
manimgl start.py SquareToCircle

弹出的窗口会播放如下动画,如果想要保存这段动画,则运行如下命令:

1
manimgl start.py SquareToCircle -ow

同样的,不会再弹出窗口,等待程序运行完成后会自动打开该视频文件(默认存放在与 start.py 同级的 videos/ 文件夹中):

如果你的渲染后的动画效果只有后半截变成圆形的动画,丢失了前半截的动画,则查看BUG说明部分

启用交互

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

1
self.embed()

这时再执行 manimgl start.py SquareToCircle

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

如果你想要直接进入交互模式的话, 你可以直接运行下面的命令:

1
manimgl

BUG说明

如果出现了渲染丢失的问题,请将 Python 程序的显卡调用设置为独显调用,集成显卡会出现不可预知的错误。

此处以 NVIDIA 为示例

  • 进入 NVIDIA 的程序【控制面板】,选择【程序设置】

    image-20220615161459190
  • 选择 Python 程序,为该程序首选独立显卡,最后应用即可

    image-20220615161616293

End

到这里,就已经完成了 Manim的安装和基本处理过程的上手体验,后面将会开始正式的 Manim 的制作。