MANIM的基本构成要素(Building blocks)
简介
本质上,manim就是把三个你可以支配并且精心放置的“概念”组合在一起然后生成数学动画。这三个“概念”是:数学物体(mathematical object用 mobject的缩写形式)、动画(animation)、场景(scene)。在接下来的介绍中可以看到,这三个概念中的每一个都作为一个单独的“类”被独立的执行。这三个类是:Mobject、Animation和Scene。
Mobject
Mobject是manim动画中基本的构造块(building block)。每一个从Mobject派生出的类代表着一个可以被放置在屏幕上的物体。
For example, simple shapes such as
Circle
,Arrow
, andRectangle
are all mobjects. More complicated constructs such asAxes
,FunctionGraph
, orBarChart
are mobjects as well.
如果你尝试放置一个Mobject中的实例,你只会看见一个空的框架。原因是:Mobject类是其他所有mobject的抽象基类,也就是说,它是没有提前决定好的视觉形象能被展示再屏幕上。因此,你将很少使用平凡的没有经过修饰的Mobject实例,相反,你更有可能创建它的派生类别中的实例。其中的一个就是VMobject。V代表着向量化(vectorized)。本质上,vmobject是一个使用矢量图来显示的mobject。大多数时间,你将处理vmobjects,尽管我们还是继续使用“mobject”去指代可以将图形放置在屏幕上的这个类别(Mobject),因为mobject含义更加广泛。
Note
Any object that can be displayed on the screen is a
mobject
, even if it is not necessarily mathematical in nature.任何能在屏幕上显示的物体都是mobject,即便事实上它不一定有数学含义。
Tip
To see examples of classes derived from
Mobject
, see thegeometry
module. Most of these are in fact derived fromVMobject
as well.
接下来我将把Mobject的一些要点整合进几个代码中:
from manim import *
class MobjectPlacement(Scene):
def construct(self):
#图像创建
#shift从原点以某方向移动
circle01 = Circle().shift(RIGHT) #也可以分开写
#分开写法示例
# square = Square()
# square.shift(LEFT)
circle02 = Circle()
square = Square()
triangle = Triangle()
#图像放置
#move_to 相对于坐标原点的移动
circle02.move_to(LEFT * 2)
#next_to 相对于第一个放置的mobject的移动
square.next_to(circle02, UP)
#align_to 下面的一行代码表示让三角形的左边界与圆的左 边界对齐 注意是边界而不是最左边的点
triangle.align_to(circle02, LEFT)
#图像显示
#add 只是单纯的将图像显示不会有动画过程
self.add(circle01,circle02, square, triangle)
self.wait(1)
#remove 可以移除图像
self.remove(circle01)
from manim import *
class MobjectStyling(Scene):
def construct(self):
circle = Circle().shift(LEFT)
square = Square().shift(UP)
triangle = Triangle().shift(RIGHT)
#图形的样式
#set_stroke 设置边框的颜色、宽度
circle.set_stroke(color=GREEN, width=20)
#set_fill 设置图形内部的颜色、透明度(0到1)
#由于默认图形内部是透明的,必须设置透明度才可以显示图 形颜色。
square.set_fill(YELLOW, opacity=1.0)
triangle.set_fill(PINK, opacity=0.5)
#图形的add顺序
#放置在后面的mobject会覆盖在之前放置的上面
#下一行代码显示三角形在最上面
self.add(circle, square, triangle)
self.wait(1)
NOTE:
Only instances of VMobject
implement set_stroke()
and set_fill()
. Instances of Mobject
implement set_color()
instead. The vast majority of pre-defined classes are derived from VMobject
so it is usually safe to assume that you have access to set_stroke()
and set_fill()
.
Animations
动画是manim的核心部分。以下仍提供几个整合的代码示例:
from manim import *
class SomeAnimations(Scene):
def construct(self):
square = Square().set_fill(BLUE, opacity=1.0)
circle = Circle().set_fill(RED, opacity=1.0)
#play 用run_time设置演示时间
#FadeIn 渐进显示(通过插值不断变化透明度实现 透明度从0到1)
self.play(FadeIn(square),run_time=3)
#Rotate 旋转
self.play(Rotate(square, PI/4))
#ApplyMethod 任何mobject的属性可以用这个方法改变,并且以动画的形式在屏幕上显示出来
self.play(ApplyMethod(square.set_fill, WHITE))
self.play(ApplyMethod(square.shift, UP))
self.play(ApplyMethod(square.rotate, PI/4))
#mobject间的转换 Transform
self.play(Transform(square,circle))
#FadeOut 渐进淡出(透明度从1到0)
self.play(FadeOut(square),run_time=2)
#值得注意的是转换后的circle是没有被放置上去的
#因此要实现淡出效果,内部的变量仍然是square而不是转变后的circle
Scenes
Scene
好比manim的结缔组织。每个 mobject 都必须added
到一个场景才能显示,或者removed
从它停止显示。每个动画都必须在一个场景中才可以显示出来,并且每个没有动画发生的时间间隔都通过调用wait( )确定。视频的所有代码都必须包含在construct()
派生自Scene
. 最后,Scene
如果要同时渲染多个场景,则单个文件可能包含多个子类。