【指南】manimCE使用指南(1)

视频效果

代码一览

from manim import *

class Beginning(Scene):
    def construct(self):
        title = Text("胡说数学",font="ipix_12px",font_size=DEFAULT_FONT_SIZE*2)
        subtitle_vol = Text("第一集",font="ipix_12px")
        subtitle = Text("从数羊开始的数字",font="ipix_12px")
        author = Text("By Nickwald",font="ipix_12px")
        l = Line(UP,DOWN)

        subtitle_vol.next_to(title,RIGHT+DOWN*0.8,buff=-2)
        subtitle.next_to(title,RIGHT+UP*0.7,buff=-2)
        l.next_to(title,RIGHT,buff=-2.5)
        author.next_to(l,DOWN,buff=LARGE_BUFF)

        titleWriteIn = [
            Write(subtitle_vol),
            Write(subtitle)
        ]

        titleFadeOut = [
            FadeOut(title),
            FadeOut(subtitle_vol),
            FadeOut(subtitle),
            FadeOut(l),
            FadeOut(author)
        ]

        self.play(Write(title))
        self.play(title.animate.shift(LEFT*3))
        self.play(Create(l))
        self.play(AnimationGroup(*titleWriteIn))
        self.play(Write(author))
        self.wait()
        self.play(AnimationGroup(*titleFadeOut))

        self.wait()

代码讲解

固定格式

首先,使用manim制作视频时,都需要在开头添加manim库:

from manim import *

接下来,我们便需要创建一个场景:

class YourSceneName(Scene):
    def construct(self):

需要注意的是,一个代码文件中可以存在多个场景,看起来可能是这样的:

class SceneName1(Scene):
    def construct(self):
    //Your code here...

class SceneName2(Scene):
    def construct(self):
    //Your code here...

如果有多个场景,在使用manimCE渲染时,需要你选择要渲染的场景。

一般文字(Text对象)

[tip type='info']manimCE中的Text对象说明:说明文档 [/tip]
注意到之前的代码中有这样一行:

title = Text("Section 1:从数羊开始……",font="ipix_12px",font_size=30).to_corner(UL)

这行代码做了两件事:

  • 创建Text对象
  • 设置Text位置

我们逐个分析。

线

l = Line(UP,DOWN)

这里创建了一个线的对象,但是,为什么是UPDOWN呢?

[tip type='info']如果有一定线性代数基础,那么我们容易知道,变换和坐标都可以通过数学上的矩阵去描述。[/tip]

事实上,manim中的UPDOWN等常量本质上就是一个矩阵,所以上文中的DOWN*3也就不难理解了。

另一种使用Line的方式为:

dot1 = Dot(point = UL)
dot2 = Dot(point = DR)
l = Line(dot1, dot2)

这段代码实现的是连线dot1dot2

动画播放

前面都是初始化的步骤,接下来,我们将决定对象将以怎样的方式去展现。

很庆幸的是,manim已经帮我们内置了极多的动画方法,我们可以直接使用,就可以实现丰富高级的动画。

基本的代码格式是:

self.play(Animations)

实现"书写"文字

Write(Object)

[tip type='info']manim所有的动画效果都必须放在self.play()的括号中,不然会出现"闪现"的情况。这是因为self.play()会自动插值,使得坐标变换等移动变得顺滑。[/tip]

Write()默认从左往右"书写"文字,如果想从右往左,仅仅需要将reverse属性设置为True。下面是一个具体的例子

self.play( Write(textObject, reverse=True) )

动画组

一般动画是逐个播放的,比如先是"画一条线",然后再"移动这条线"。但是,有时候我们想让几个动画同时进行,比如"在向左移动的同时将自身的透明度从0变为1"。这个时候,我们便需要引入动画组的概念。

# 定义一个动画组
titleFadeOut = [
            FadeOut(title),
            FadeOut(subtitle_vol),
            FadeOut(subtitle),
            FadeOut(l),
            FadeOut(author)
        ]

# 播放动画组
self.play(AnimationGroup(*titleFadeOut))

类似数组一样,我们仅仅需要将要同时播放的动画放进去,然后使用AnimationGroup()方法即可。唯一需要注意的是,括号内动画组名字的开头需要添加星号

评论区
头像
文章目录