Contents
什么是Manim
Manim是一个基于Python编写的数学动画引擎,可以做出像3b1b那样高逼格的解释性的数学动画。在Github上已经有了两万多star,链接https://github.com/3b1b/manim。本文开头的动画只是一个最简单的例子。
Manim的安装
本机安装(Mac)
需要准备
- MiKTex: 这是用来给manim生成文字的。建议在这里下载Basic版的,只有200MB:https://miktex.org/download
- FFmpeg: 视频处理程序。
- dvisvgm: DVI转SVG的工具。
运行以下命令安装依赖项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# !-bash brew install cairo pip3 install manimlib brew install pkg-config export PKG_CONFIG_PATH=/usr/local/Cellar/libffi/3.2.1/lib/pkgconfig/ pip3 install pycairo sudo pip3 install sox sudo pip3 install ffmpeg brew install ffmpeg sudo pip3 install latex sudo pip3 install pycairo brew cask install basictex brew install brotli brew install woff2 |
安装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 42 |
#!/bin/bash set -xeuo pipefail IFS=$'\n\t' PREFIX="${1:-/usr/local/dvisvgm}" TEX="$(kpsewhich -var-string 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 |
详细的步骤解释见 http://gavinzhang.work/%E5%85%B6%E4%BB%96/manim%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B.html
使用Docker
如果嫌在本机安装太麻烦而且不好卸载,可以使用Docker
来快速构建所需要的环境。
首先要准备好Docker的环境,这里提供了Ubuntu和Mac的Docker安装方法:《DOCKER – 镜像和容器的构建使用》。
运行以下命令
1 2 3 4 5 6 7 8 9 |
# !-bash sudo docker pull eulertour/manim # 拉取镜像 sudo docker run -it --name="manim" -v /home/[你的manimu本地工作目录]:/tmp/input eulertour/manim # 启动容器并且挂载本地的目录 # 按下Ctrl+P+Q 将容器运行在后台 sudo docker exec -it manim /bin/bash # 连接到容器 cd /tmp/input |
就这样几行,所需要的环境就配置好啦。
让Manim支持中文
让Manim
支持中文稍微有些麻烦,主要步骤有以下三步:
① 安装texlive
。
② 下载并安装中文字体。
③ 修改Manim
的tex引擎设置为CTex,并在CTex的模板中设置字体。
安装TexLive
texlive是一个发行版,包括tex, latex, xelatex等等诸多工具。官网 https://www.tug.org/texlive/。
① 联网安装,首先下载一个3M大小的安装文件,http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz,在linux下运行,联网安装texlive
如果此前安装过texlive,需要先删除上次安装目录:(将2019换成上次安装的版本)
1 2 3 |
rm -rf /usr/local/texlive/2019 rm -rf ~/.texlive2019 |
解压缩安装包,然后执行
1 2 |
sudo ./install-tl |
根据命令行的提示,输入大写的i
开始安装。
安装完成后,需要配置PATH,修改/etc/profile文件,增加一行
1 2 |
export PATH=/usr/local/texlive/2019/bin/x86_64-linux:$PATH |
② 安装包安装
下载完整的离线安装包(4G左右) https://www.tug.org/texlive/acquire-iso.html。如果下载速度过慢,可以手动选择距离近的下载镜像:
[清华镜像]
[上海交大镜像]
[中科大镜像]
[重庆大学镜像]
下载好以后挂载iso文件:
1 2 3 4 |
# !-bash mount -o loop texlive2019-20190410.iso /media/texlive cd /media/texlive |
然后执行sudo ./install-tl
开始安装,之后的环境变量设置步骤和联网安装相同。
下载和安装字体
在/usr/share/fonts
目录下新建一个目录custom
,将下载的字体都复制到里面。然后执行下面的更新字体命令:
1 2 3 4 5 6 |
# !-bash fc-cache -f -s -v # 更新字体 fc-list :lang=zh # 查看中文字体 fc-list | grep Times # 查找包含times的字体 |
为了方便,我把常用的微软雅黑(MSYH.TTC
)和数学公式字体(latinmodern-math.otf
)上传到服务器了。[点击下载]
修改Manim的配置文件
首先进入manim的安装目录:cd /usr/local/lib/python3.7/site-packages/manimlib
。
修改配置文件vim constants.py
:
修改其中的TEX
引擎配置:
1 2 3 |
# /usr/local/lib/python3.7/site-packages/manimlib/constants.py TEX_USE_CTEX = True |
保存后再修改ctex的模板文件vim ctex_template.tex
:
其中的\setmainfont
和\setCJKmainfont
分别是设置英文和中文字体。
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 |
% /usr/local/lib/python3.7/site-packages/manimlib/ctex_template.tex \documentclass[preview]{standalone} \usepackage[english]{babel} \usepackage{amsmath} \usepackage{amssymb} \usepackage{dsfont} \usepackage{setspace} \usepackage{tipa} \usepackage{relsize} \usepackage{textcomp} \usepackage{mathrsfs} \usepackage{calligra} \usepackage{wasysym} \usepackage{ragged2e} \usepackage{physics} \usepackage{xcolor} \usepackage{microtype} %\DisableLigatures{encoding = *, family = * } \usepackage[UTF8]{ctex} \setmainfont{Latin Modern Math} \setCJKmainfont{Microsoft YaHei} \linespread{1} \begin{document} YourTextHere \end{document} |
运行第一个example
就用文章开头的动画做例子吧,在本地的工作目录新建一个example.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#! example.py from manimlib.imports import * class Demo(Scene): def construct(self): text = TextMobject( 'Manim', color=WHITE ) text.scale(2) # 2倍大小 self.play(Write(text)) self.wait(0.5) self.play(text.to_corner, UP + LEFT) # 移动到角落 self.wait(0.1) text2 = TextMobject( '安装和使用', color=WHITE ) text2.scale(2.5) self.play(Write(text2)) self.wait(1) self.wait() |
保存以后就会同步出现在docker里了,然后在docker
容器里运行:
1 2 |
manim example.py Demo -m |
其中-m
表示中等画质,也可以用-l
低画质更方便预览。
在官方源码的example_scenes.py有更多的例子。
参考资料
texlive的安装以及用xetex和xelatex进行中文编辑 https://blog.csdn.net/lizhe_dashuju/article/details/88708562