3Blue1Brown 动画制作教程(1)--制作第一个自己的动画

3Blue1Brown 动画制作教程(1)--制作第一个自己的动画

制作第一个自己的动画


前一篇详细介绍了 3Blue1Brown 的动画引擎在 Windows 10 64 位系统上,基于 Anaconda的配置方法,并且详细描述了在配置 3Blue1Brown 提供的 manim 动画引擎时可能会出现的问题及解决方法:

李狗嗨:3Blue1Brown的动画引擎如何配置?zhuanlan.zhihu.com图标

上面那篇文章发布后,有很多朋友按照该教程成功配置了该动画引擎,同时也有很多热心知友希望能学习更多关于 manim 动画引擎的使用方法。

说实话,该动画制作方法对 Python 的编程水平有一定的要求,如果是 Python 初学者,很可能会在学习动画制作的过程中面临很多编程方面的问题,我尽量把这部分内容写得接地气一些,不过一个困难在于 3Blue1Brown 的官方教程尚未完成,不能提供一个完善的动画制作指南。

幸运的是,威斯康星大学的一位物理教授 Todd Zimmerman 从他的个人视角摸索着写了一套使用教程:

https://talkingphysics.wordpress.com/2019/01/08/getting-started-animating-with-manim-and-python-3-7/talkingphysics.wordpress.com

我觉得写得很不错,就想着把该教程走一遍,权当是学习 Python 了,并希望能记录一下自己在学习制作动画过程中遇到的问题,形成一系列与之对应的 3B1B 动画制作的中文版文字教程。

该教程最重要的资料是与之配套的教程代码,该代码可以在 Todd 教授的 Github 上找到,对应的网址是:

https://github.com/zimmermant/manim_tutorial/blob/master/manim_tutorial_P37.pygithub.com


将该 Python 代码下载下来,或者直接将代码内容复制并保存为 manim_tutorial_P37.py 脚本文件,然后将该文件置于manim文件夹的根目录下。至于manim文件夹的配置,在《3Blue1Brown的动画引擎如何配置?》中已经有详细讲解,这里不再赘述。

为了测试是否配置正确,以管理员模式打开Anaconda Prompt,注意一定要用管理员模式打开:

跳转到manim的根目录:

cd <manim 的根目录>

该命令的意思是:跳转 (cd, Change Directory) 到 manim 的根目录中(注意:按照个人的实际路径进行跳转,图中的路径只是一个参考)。

建议将Python升级到3.7版本(如果本来就是3.7.6版的Python就没必要再更新了)。输入以下代码即可,安装的时候耐心等待,中断的话会很麻烦。

conda install python=3.7

确保前面得到的文件 manim_tutorial_P37.py 已经在 manim 的根目录中,然后输入以下测试命令

python -m manim manim_tutorial_P37.py Shapes -pl

这个时候有可能出现:ModuleNotFoundError: No module named 'cv2.cv2',一般都是版本不兼容的问题,重装即可。方法是输入(当然,如果没有该问题的话就别多此一举了):

pip uninstall opencv-python

然后:

pip install opencv-python

如果还有其他无法解决的问题,建议回到《3Blue1Brown的动画引擎如何配置?》中,把里面的安装过程再走一遍。

一切没问题之后,就可以运行上面的测试命令了。

然后就可以得到以下视频,会有预览,原视频文件可以在根目录的 media 文件夹中找到,这里为了展示我把生成的 .mp4 格式的文件转成了 .gif 文件。

下面介绍该测试命令的含义(其实所有生成动画片段的命令都是按照下面的格式):

python -m manim manim_tutorial_P37.py Shapes -pl
  • 第一个参数 “python” 意思是用python编译器进行编译;
  • 第二个参数是“-m”,意思是以脚本Script的模式运行模块;
  • 由于以脚本模式运行模块,而这里的模块其实指的是 manim.py,但是在 -m 模式下只要输入模块的模块名,而不能包含后面的.py后缀,也就是命令中的第三个参数“manim”;
  • 第四个参数 “manim_tutorial_P37.py” 是用来编写图形动画的脚本文件,该参数是需要.py 后缀的;
  • 第五个参数 “Shapes” 是脚本文件中所定义的一个类的类名;
  • 第六个参数 “-pl” 意思是动画生成后自动预览(Preview),且分辨率较低(Low quality),这样生成的速度快一些。

关于第六个参数的设置可以参考其动画引擎的内部说明,输入以下命令即可查看:

python -m manim --help

下面来说说代码的结构和动画的制作思路,如果打开脚本文件 manim_tutorial_P37.py ,将看到最前面的一部分如下:

1. from manimlib.imports import *
2. import os
3. import pyclbr
4.
5. class Shapes(Scene):
6. # A few simple shapes
7. # Python 2.7 version runs in Python 3.7 without changes
8.     def construct(self):
9.         circle = Circle()
10.        square = Square()
11.        line=Line(np.array([3,0,0]),np.array([5,0,0]))
12.        triangle=Polygon(np.array([0,0,0]),np.array([1,1,0]),np.array([1,-1,0]))
13.
14.        self.add(line)
15.        self.play(ShowCreation(circle))
16.        self.play(FadeOut(circle))
17.        self.play(GrowFromCenter(square))
18.        self.play(Transform(square,triangle))

第 1、2、3 行导入了所有需要的 Python 模块,这里就不再多加解释,这部分也是作者希望尽可能避免被修改的地方,从而可以把精力都放在具体动画内容的设计上,因此模块的导入方法按照上面的来就行。

然后下面定义了一个 Class,也就是所谓的“类”,该“类”的名字是“Shapes”,python 是面向对象的语言,类是面向对象语言中的一个重要概念,类具有“封装”、“继承”、“多型”的特点。类被实例化后就是一个 “Object” ,也就是“对象”,而通过命令行输入命令就可以直接实例化该脚本文件中指定的类,前面多次提到的测试命令中的第五个参数就是用来指定需要实例化的类。

脚本中的每一个类都继承于一个父类“Scene”,可以翻译为一个“场景”。我们要做的就是将这个空场景的各种属性和方法直接继承过来,然后在该空场景中再定义一个 construct() 方法,该方法的输入参数 self 指的是实例化对象 Object 本身,通过这个 construct() 方法,我们可以往场景中添加我们想添加的图形并设计这些图形的表现形式。

代码中的第 9、10、11、12 行分别定义了一个,一个正方形,一条线段,一个三角形

然后利用实例化对象的 add() 或 play() 等方法去展现各个图形在场景“Scene”中的表现形式。

  • 第14行的意思是:将线段添加到场景中;
  • 第15行的意思是:以绘图的方式显示出圆;
  • 第16行的意思是:圆淡出场景;
  • 第17行的意思是:以从中心扩张的形式生成一个正方形;
  • 第18行的意思是:将该正方形以无缝衔接的形式变形为三角形。

为了对比过程方便,这里再放一次动画:

小结

由此我们可以发现, 3B1B 动画的制作思路是:根据自己想在场景中展现的内容和效果编写一系列的类,然后通过命令行对每个类进行实例化,前面输入的测试命令其实就包含了类的实例化过程,而每个类被实例化后都将得到一个动画片段,通过视频制作软件将各个片段衔接起来并配音,就能得到大家喜闻乐见的 3B1B 教学动画了。

意犹未尽?看下一篇!

3Blue1Brown 动画制作教程(2)zhuanlan.zhihu.com图标


更多内容,尽在专栏:

直观の数学zhuanlan.zhihu.com图标

#原创文章,知乎首发,

未经允许,不得转载#

编辑于 03-05

文章被以下专栏收录