MANIM的基本构成要素(Building blocks)

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, and Rectangle are all mobjects. More complicated constructs such as Axes, FunctionGraph, or BarChart 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 the geometry module. Most of these are in fact derived from VMobject 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如果要同时渲染多个场景,则单个文件可能包含多个子类。

 

 

 

 

上一篇:【Adobe Premiere Pro脚本开发】控件面板是否可见


下一篇:Redis热点key优化