背景图

Manim基础教程

简介

manim项目是一个非常棒的开源动画制作库,主要用于制作跟数学物理相关的动态视频,基于MIT许可,由3blue1brown开发。3b1b已经进驻B站,墙裂推荐大家先去看看他的视频,视频中几乎所有动画都是由此库生成。

github项目地址:https://github.com/3b1b/manim

安装(Mac)

可以先安装cairo;cairo 是一个免费的矢量绘图软件库,它可以绘制多种输出格式。cairo 支持许多平台,包括 Linux、BSD、Microsoft® Windows® 和 OSX(BeOS 和 OS2 后端也正在开发)。Linux 绘图可以通过 X Window 系统、Quartz、图像缓冲格式或 OpenGL 上下文来实现。另外,cairo 还支持生成 PostScript 或 PDF 输出,从而产生高质量的打印结果。在理想情况下,cairo 的用户可以在打印机和屏幕上获得非常接近的输出效果。

虽然 cairo 是使用C语言撰写的,但是当使用 cairo 时,可以用许多其他种语言来使用,包括有 C++、C#、Java、Python、Perl、Ruby、Scheme、Smalltalk 以及许多种语言,cairo 在 GNU LGPL 与 Mozilla Public License (MPL) 两个认证下发布。

我们可以使用cairo来输出R语言的高质量图形。

http://blog.fens.me/r-cairo/

1
> brew install cairo

安装manimlib

1
pip3 install manimlib

https://pycairo.readthedocs.io/en/latest/

这时使用manim命令时仍然会报错,主要的原因是cairo是C语言写的,如果python需要import cairo就必须安装pycairo,使用sudo pip3 install pycairo.在安装过程中出现以下错误:

1
2
error: Setup script exited with 'pkg-config' not found.
Command ['pkg-config', '--print-errors', '--exists', 'cairo >= 1.13.1']

这是因为缺少pkg-config项目而导致的:

1
brew install pkg-config

后面又出现了

1
2
Package 'libffi', required by 'gobject-2.0', not found
Command '['pkg-config', '--print-errors', '--exists', 'cairo >= 1.13.1']' returned non-zero exit status 1.

解决方法是使用export PKG_CONFIG_PATH=/usr/local/Cellar/libffi/3.2.1/lib/pkgconfig/,然后继续使用pip3 install pycairo,注意这里不能加上sudo,因为sudo之后PKG_CONFIG_PATH对应的环境变量的值就没有了,不加上sudo也会安装成功的。

clone一下项目,安装其他包:

1
2
3
4
5
6
pip3 install sox
pip3 install ffmpeg
brew install ffmpeg
pip3 install latex
pip3 install pycairo
pip3 install -r requirements.txt

如果想使用svg,需要安装dvisvgm: DVI转SVG的工具。这个篇文章https://tobywf.com/2017/04/build-dvisvgm-kpathsea-on-macos/ 将介绍怎么安装。这里需要注意的是我们需要安装basictex,这是tex的基本版,如果要安装最全版,就要安装mactex。安装的方式也很简单,需要用到brew cask,直接使用brew安装是不行的。安装命令brew cask install basictex.

然后根据文章中的脚本进行安装,注意这里的脚本最好改一下路径,另外脚本中kpsewhich -var SELFAUTOLOC由于kpsewhich命令的关系需要改成kpsewhich --var-value=SELFAUTOLOC.解决了其他的依赖后就可以使用该脚本成功安装dvisvgm了。

安装dvisvgm可以使用以下的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash
set -xeuo pipefail
IFS=$'\n\t'

PREFIX="${1:-/usr/local/dvisvgm}"
TEX="$(kpsewhich -var SELFAUTOLOC)"

echo "$PREFIX, $TEX"

brew install automake freetype ghostscript potrace

# download the sources
mkdir -p "$PREFIX/source/texk"
cd "$PREFIX/source/"

# see https://www.tug.org/texlive/svn/
rsync -av --exclude=.svn tug.org::tldevsrc/Build/source/build-aux .
rsync -av --exclude=.svn tug.org::tldevsrc/Build/source/texk/kpathsea texk/

git clone git@github.com:mgieseki/dvisvgm.git

# compile kpathsea
cd texk/kpathsea

# patch SELFAUTOLOC
perl -0777 -i.bak \
-pe 's|(kpathsea_selfdir \(kpathsea kpse, const_string argv0\)\n{)|$1\n return xstrdup("'"$TEX"'");\n|g' \
progname.c
./configure --prefix="$PREFIX/"

make
make install

# compile dvisvgm
cd ../../dvisvgm

./autogen.sh
CPPFLAGS="-I$PREFIX/include/" LDFLAGS="-L$PREFIX/lib/" ./configure --prefix="$PREFIX/"
make
make check
make install

执行这个脚本的时候,会报错这是因为需要安装Brotiwoff2

1
2
> brew install Broti
> brew install woff2

https://github.com/otrv4/pidgin-otrng/issues/104
https://github.com/omisego/plasma-mvp/issues/19
https://juejin.im/post/5d1740b9e51d455d850d3b2e#heading-7
https://gist.github.com/tobywf/aeeeee63053aaaa841b4032963406684

使用

manim的使用比较简单,就是在manimlib包下面的一些类。使用mainim的画图规则是:

  1. 先定义一个图形
  2. 定义绘制行为

比如画一个正方形,首先你要定义一个什么样的正方形,然后进行绘画即可。

1
2
3
4
5
6
7
8
9
10
11
class SquareToCircle(Scene):
def construct(self):
circle = Circle()
square = Square()
square.flip(RIGHT)
square.rotate(-3 * TAU / 8)
circle.set_fill(PINK, opacity=0.5)

self.play(ShowCreation(square))
self.play(Transform(square, circle))
self.play(FadeOut(square))

具体的实例可以查看:https://github.com/3b1b/manim/blob/master/example_scenes.py

执行

执行的话可以使用manim example_scenes.py

0%