快速入门¶
在按照 安装指南 页面中的指导安装好 manim 的环境后,你可以尝试从头开始自己制作一个场景。
首先,根据如下结构创建一个新的 .py
文件(如 start.py
):
manim/
├── manimlib/
│ ├── animation/
│ ├── ...
│ ├── default_config.yml
│ └── window.py
├── (custom_config.yml)
└── start.py
然后粘贴如下代码(稍后我会详细解释其每行的作用):
1 2 3 4 5 6 7 8 9 | 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)
self.add(circle)
|
运行这个命令:
manimgl start.py SquareToCircle
屏幕上会弹出一个窗口,这时你可以:
滚动鼠标中键来上下移动画面
按住键盘上 z 键的同时滚动鼠标中键来缩放画面
按住键盘上 f 键的同时移动鼠标来平移画面
按住键盘上 d 键的同时移动鼠标来改变三维视角
按下键盘上 r 键恢复到最初的视角
最后,你可以通过按 q 来关闭窗口并退出程序.
再运行这个命令:
manimgl start.py SquareToCircle -os
这时将没有窗口弹出,当程序运行结束后,会自动打开这张渲染得到的图片
(默认位于同级目录的子目录 images/
中):
制作图片¶
接下来我们来详细看看每一行都有什么作用:
Line 1:
from manimlib import *
这将一步引入在使用 manim 时所有可能会用到的类。
Line 3:
class SquareToCircle(Scene):
创建一个 Scene
的子类 SquareToCircle
,
这将是你编写并要渲染的场景。
Line 4:
def construct(self):
编写 construct()
方法,
这里面的内容将决定如何创建画面中的物体,以及需要执行哪些操作。
Line 5:
circle = Circle()
创建一个圆(Circle
类的实例),叫做 circle
。
Line 6~7:
circle.set_fill(BLUE, opacity=0.5)
circle.set_stroke(BLUE_E, width=4)
通过调用 circle 的方法设置 circle 的样式。
.set_fill()
方法将这个圆的填充颜色设为蓝色(BLUE
,在 常量部分 constants 中定义),填充透明度设为0.5。.set_stroke()
方法将这个圆的线条颜色设为深蓝色(BLUE_E
,在 常量部分 constants 中定义),线条宽度设为4
Line 9:
self.add(circle)
添加动画¶
下面我们改变一些代码,添加一些动画来制作视频而不是仅仅只有图片。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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()
self.play(ShowCreation(square))
self.wait()
self.play(ReplacementTransform(square, circle))
self.wait()
|
这次运行:
manimgl start.py SquareToCircle
弹出的窗口中会播放一个绘制正方形并变换为圆的动画。 若想要保存这段动画,运行:
manimgl start.py SquareToCircle -ow
这次将不会弹出窗口,但会在运行结束后自动打开这个视频文件
(默认存放在与 start.py
同级的 videos/
文件夹中):
我们再来看看这次的代码。前7行和前面的一样,第8行类似第5行,
创建了一个 Square
类的实例,命名为 square
。
Line 10:
self.play(ShowCreation(square))
通过 Scene
的 play()
方法播放了一个动画。
ShowCreation
为一个动画,其表示呈现出创建给出物体的过程。
self.play(ShowCreation(square))
即播放创建 square
的动画。
Line 11:
self.wait()
通过 Scene
的 wait()
方法来停顿(默认1s),
你可以向其中传入参数来表示停顿的时间(如 self.wait(3)
表示停顿3s)
Line 12:
self.play(ReplacementTransform(square, circle))
播放将 square
变化为 circle
的动画。ReplacementTransform(A, B)
表示把A转换为B的图案并替代B
Line 13: 同Line 11,停顿1s
启用交互¶
支持交互是新版本的新特性,可以在代码的末尾加上如下一行来启用交互:
self.embed()
这时再执行 manimgl start.py SquareToCircle
。
在前面的动画执行后,将会在命令行打开 iPython 终端。这时你将不能触碰动画窗口,而只能在终端中输入要运行的代码,
如果要和动画窗口进行互动,则要在终端中输入 touch()
或 self.interact()
。
在 iPython 中你可以继续编写代码,
回车后将会立即运行你输入的语句。例如:向其中分别输入以下行
(self.play
在此时可以简写为 play
):
# 在水平方向上拉伸到四倍
play(circle.animate.stretch(4, dim=0))
# 旋转90°
play(Rotate(circle, TAU / 4))
# 在向右移动2单位同时缩小为原来的1/4
play(circle.animate.shift(2 * RIGHT), circle.animate.scale(0.25))
# 为了非线性变换,给circle增加10段曲线(不会播放动画)
circle.insert_n_curves(10)
# 给circle上的所有点施加f(z)=z^2的复变换
play(circle.animate.apply_complex_function(lambda z: z**2))
# 关闭窗口并退出程序
exit()
你将得到类似下面的动画:
如果你想要直接进入交互模式的话,你不必特意编写一个只含 self.embed()
的空场景,
你可以直接运行下面的命令(这会在弹出窗口的同时进入iPython终端):
manimgl