注 : 在此之前,请按照安装中的步骤安装
Manim
并确保其正常运行。有关在Jupyterlab
或Jupyter notebook
中使用Manim
的信息,请参阅IPython magic command
的文档。
本快速入门指南将引导您使用 Manim
创建一个示例项目:一个用于精确编程动画的动画引擎。
首先,您将使用命令行界面创建一个场景(Scene),Manim
通过该类生成视频。在该场景中,您将制作一个圆形的动画。接下来,您将添加另一个场景,显示一个正方形转变为圆形。这将是对 Manim
动画能力的介绍。然后,您将定位多个数学对象(Mobjects)。最后,您还将学习.animate
语法,这是一种强大的功能,可以将您用来修改 Mobjects
的方法动画化。
首先创建一个新文件夹。在本指南中,将文件夹命名为项目。该文件夹是项目的根文件夹。它包含 Manim
运行所需的所有文件,以及项目产生的任何输出。
from manim import *
class CreateCircle(Scene):
def construct(self):
circle = Circle() # 创造一个圆
circle.set_fill(PINK, opacity=0.5) # Pink 为填充颜色 , opacity不透明度
self.play(Create(circle)) # show the circle on screen 展示创造圆的过程
project/
└─scene.py
manim -pql scene.py CreateCircle
Manim 将输出渲染信息,然后创建一个 MP4 文件。您的默认电影播放器将播放 MP4 文件,并显示以下动画.
如果您看到一个粉红色圆圈正在绘制的动画,那么恭喜您!您刚刚从零开始编写了第一个 Manim 场景。
如果您收到的是错误信息,看不到视频,或者视频输出与前面的动画不一样,很可能是 Manim 安装不正确。请参阅我们的常见问题部分FAQ section,以获得有关最常见问题的帮助。
让我们逐行查看刚才执行的脚本,看看 Manim 是如何画出这个圆的。
第一行导入了库中的所有内容:
from manim import *
这是使用 Manim
的推荐方式,因为一个脚本通常会使用 Manim 命名空间中的多个名称。在你的脚本中,你导入并使用了 Scene、Circle、PINK
和 Create
。
现在让我们看看接下来的两行:
class CreateCircle(Scene):
def construct(self):
[...]
大多数情况下,动画脚本的代码完全包含在场景类的 construct() 方法中。在 construct() 方法中,您可以创建对象、将其显示在屏幕上并制作动画。
接下来的两行创建了一个圆,并设置了它的颜色和不透明度:
circle = Circle() # 创建一个圆
circle.set_fill(PINK, opacity=0.5) #设立颜色与不透明度
最后,最后一行使用 Create 动画在屏幕上显示圆圈:
self.play(Create(circle)) # 在屏幕上显示创建圆的过程
提示
所有动画必须位于从 Scene 派生的类的 construct() 方法中。其他代码:如辅助函数或数学函数,可以位于类之外。
圆圈动画制作完成后,让我们继续制作更复杂的动画。
1.打开 scene.py
,在 CreateCircle
类下面添加以下代码段:
from manim import *
class SquareToCircle(Scene):
def construct(self):
circle = Circle() # create a circle
circle.set_fill(PINK, opacity=0.5) # set color and transparency
square = Square() # create a square
square.rotate(PI / 4) # 旋转一定的幅度
self.play(Create(square) , run_time = 4 ) # animate the creation of the square
self.play(Transform(square, circle) , run_time = 4) #把方形变成圆形
self.play(FadeOut(square)) # fade out animation
SquareToCircle
:manim -pql scene.py SquareToCircle
这个示例展示了 Manim 的主要功能之一:只需几行代码就能实现复杂的数学密集型动画(例如在两个几何图形之间进行干净利落的插值)。
接下来,我们来学习一些定位 Mobjects 的基本技巧。
class SquareAndCircle(Scene):
def construct(self):
circle = Circle() # create a circle
circle.set_fill(PINK, opacity=0.5) # set the color and transparency
square = Square() # create a square
square.set_fill(BLUE, opacity=0.5) # set the color and transparency
square.next_to(circle, RIGHT, buff=0.5) #设定文职
self.play(Create(circle), Create(square)) # show the shapes on screen
manim -pql scene.py SquareAndCircle
next_to
是一种 Mobject
方法,用于定位 Mobject
。
我们首先通过传递圆作为方法的第一个参数,指定粉色圆圈作为正方形的参考点。第二个参数用于指定 Mobject 相对于参考点的放置方向。在本例中,我们将方向设置为 RIGHT,告诉 Manim 将正方形放置在圆的右侧。最后,buff=0.5
在两个对象之间设置了一个小的距离缓冲区。
将 right
改为 left
、up
或 down
,看看正方形的位置有何变化。使用定位方法,您可以渲染包含多个 Mobjects 的场景,使用坐标设置它们在场景中的位置,或将它们相对定位。
有关 next_to 和其他定位方法的更多信息,请查看我们参考手册中的 Mobject 方法列表。
.animate
语法制作动画方法本教程的最后一课是使用 .animate,这是一种 Mobject 方法,它可以将你对 Mobject 所做的更改动画化。当你在任何修改 Mobject 的方法调用前加上 .animate 时,该方法就会变成一个动画,可以使用 self.play 播放。让我们回到 SquareToCircle,看看在创建 Mobject 时使用方法与使用 .animate 将这些方法调用动画化之间的区别。
scene.py
,在 SquareAndCircle
类下面添加以下代码段:class AnimatedSquareToCircle(Scene):
def construct(self):
circle = Circle() # create a circle
square = Square() # create a square
self.play(Create(square)) # show the square on screen
self.play(square.animate.rotate(PI / 4)) # rotate the square
self.play(Transform(square, circle)) # transform the square into a circle
self.play(
square.animate.set_fill(PINK, opacity=0.5)
) # color the circle on screen
manim -pql scene.py SquareAndCircle
![[3d3dd54f-b375-4fc3-a1ba-fb937268a79d.gif]]
第一个self.play
创建正方形。
第二个self.play
将正方形旋转 45 度。
第三个动画将正方形转化为圆形,最后一个动画将圆形染成粉红色。
虽然最终结果与 SquareToCircle
相同,但 .animate
显示旋转和 set_fill
是动态应用于 Mobject
的,而不是在创建时已应用了更改。
尝试其他方法,如翻转或移位,看看会发生什么。
3. 打开 scene.py,在 AnimatedSquareToCircle 类下面添加以下代码段:
class DifferentRotations(Scene):
def construct(self):
left_square = Square(color=BLUE, fill_opacity=0.7).shift(2 * LEFT)
right_square = Square(color=GREEN, fill_opacity=0.7).shift(2 * RIGHT)
self.play(
left_square.animate.rotate(PI), Rotate(right_square, angle=PI), run_time=2
)
self.wait()
manim -pql scene.py SquareAndCircle
这个场景说明了 .animate 的怪异之处。使用 .animate 时,Manim 实际上会获取 Mobject 的起始状态和结束状态,并对两者进行插值。在 AnimatedSquareToCircle 类中,当正方形旋转时,您可以观察到这一点:正方形的四角在移动到第一个正方形转化为第二个正方形所需的位置时,似乎略有收缩。
在 DifferentRotations 中,.animate 对旋转的解释与旋转方法之间的差异要明显得多。旋转 180 度的 Mobject 的起始和结束状态是相同的,因此 .animate 会尝试插值两个相同的对象,结果是左侧的正方形。如果您发现自己在使用 .animate 时产生了类似的不必要行为,请考虑使用传统的动画方法,如右边的正方形,它使用了旋转。