manim 是什么

manim 是视频博主 3Blue1Brown 开发的动画引擎,他使用 manim 创作出了许多直观、美丽的数学科普内容。

3Blue1Brown

可以先看一下我用 manim 制作的一个小动画,之后我会放出代码。

前言

我很早就了解到了 manim,但在很久以后我才尝试去使用它,令我惊讶的是它并没有想象中的麻烦,让我不禁联想到 Apple 的 SwiftUI,使用简单的几句代码,通过「描述」这里存在着什么样的东西,就能制作出想要的效果。

安装

在 mac 终端里分别输入

brew install py3cairo ffmpeg

 

brew install cmake pango scipy

 

pip3 install manim

运行第一个项目

manim 是运行在 python 下的,首先创建一个 python 文件 test.py,它基本结构是长这样的。

from manim import * # 导入 manim

class Test(Scene): # 定义一个场景
    def construct(self):
        #code here

新建一个文件夹 manim 用来存放 manim 项目,将文件放入。

为了运行这个项目,你需要先了解一点命令行的知识。

打开 mac 的终端,目前你处于根目录下,输出 ls 可以显示当下目录下的所有文件和文件夹。

输入 cd <文件夹名> 可以进入到这个文件夹。

例如,我的文件夹 manim 是创建在文件夹 Downloads 下的,要进入 manim 文件夹,我需要输入

cd Downloads

cd manim

或者

cd Downloads/manim

进入到 test.py 所在的文件后,可以通过这样一行命令运行项目。

manim test.py Test

这里 Test 是我在上面的示例中定义的场景(Scene)名,manim 每次运行一个文件中的一个场景。

语法

先来看最简单的一个例子

circle = Circle()
self.play(Write(circle))

如此,就创建了这么一个动画

simpleExample

我们通过 circle = Circle() 创建了一个圆,然后播放(play)了 Write(circle) 这个动画。

这就是 manim 的大概逻辑了。

我们来看文章开头的那个例子是怎么实现的。

为了素材的管理方便,我在 manim 文件夹下创建了一个 images 文件夹用来存放图片,在里面放了两个歌手的图片。

注意我这里用的是 .svg 格式的矢量图,因为矢量图可以进行一个物体转变为另一个物体的插值运算。

我在文章 不会设计,如何 1 分钟让土素材变得「上镜」 里讲到如何使用 Vector Magic 将图片转化为矢量图

这时我的文件夹结构是这样的

manim
├─ images
│    ├─ cardiB.svg
│    └─ iggy.svg
└─ test.py

首先引入这两张图片

cardi = SVGMobject("./images/cardiB.svg").shift(LEFT*3).scale(3)

iggy = SVGMobject("./images/iggy.svg").shift(RIGHT*3).scale(3)

. 代表的是当前文件夹,"./images/cardiB.svg" 是图片的路径,一个对象被创建时,它默认位置在画面中心,通过 .shift(LEFT*3).scale(3) 将其往左移动 3 个单位并放大 3 倍。

self.play(Write(cardi), rate_func = smooth, run_time = 3)
self.wait(0.5)

self.play(ReplacementTransform(cardi, iggy), rate_func = smooth, run_time = 3)
self.wait(0.5)

 

  • rate_func = smooth:动画插值方式为贝塞尔曲线
  • run_time = 3:动画持续实践为 3 秒
  • self.wait(0.5):停顿 0.5 秒

这里我只写了两个动画,一个是创造第一张图片 cardiWrite() 动画,另一个是将 cardi 转变为 iggyReplacementTransform()动画。

学习资源

  • Manim Community:最好理解的文档,但是是英文的,并且需要翻梯子。
  • Manim Kindergarten:这是上面那份文档的中文版,虽说有了中文,但由于并非 1:1 翻译,其实可读性不如上面那份文档

结语

3Blue1Brown 说过,你应该使用 manim 来制作数学科普视频,如果要做其他的视频,比起 manim 有其他更好的选择。

不过,对于程序容易理解的场景(例如字幕出现),使用代码来制作动画比起剪辑软件有着更强的可更改性和复用性,或者,如果你的视频比较简单,只是一些字幕与元素的堆叠,使用 manim 能帮助你快速创建质感很强的动画。

本文只是介绍一个强大的工具,一个用代码制作动画的方式,并非想要替换掉你的工作流,合理运用多个工具的优点,如果你并没有做视频的需求,就当看个乐吧。