2.3 输出设置

2.3.1 输出文件夹

在2.2节中,当你运行manim -pql example.py Example之后,就会在同目录中生成media文件夹,里面根据不同的数据类型设置了不同文件夹,如文本、视频、图片等等。你可以在videos文件夹下找到对应的文件名,从中可以找到最终的成片。而在partial_movie_files文件夹中则存放着一小段一小段的视频,可以发现最终的视频就是由这些不同的小视频组合在一起的。

2.3.2 片段

借助self.next_section(),你可以手动设置切片位置,使得除了生成完整视频外,还能生成不同视频片段,这些视频片段存储在与成片同目录的sections文件夹中。需要注意的是,每个视频片段不能仅有一帧内容,也就是说需要包含动画变换或者self.wait()。一旦引入了self.next_section(),事实上,你可以不用在def construct(self):的下一行紧跟self.next_section(),因为他会自动生成。这就好比剪一张纸条,self.next_section()的位置就是要剪开的位置,你是不需要在最开始那剪一刀的。

next_section()有三个参数:nametypeskip_animations

  • name

    字符串,该片段的名称,视频片段的文件名结构为“类名_编号_name”。

  • type

    字符串,官方文档并没有介绍其用处,目前我只知道他的默认值为DefaultSectionType类的NORMAL属性。

  • skip_animations

    布尔值,是否跳过该片段内的所有动画内容(包括self.wait()),默认为False。若为True,则在成片中并没有该段切片,但sections文件夹中依然会保留该段切片。

注意当你使用self.next_section()时,需要使用manim -pql --save_sections example.py Example才能将片段保存在sections文件夹中。

from manim import *

class Example(Scene):
    def construct(self):
        t1 = Text('你好!Manim')
        self.add(t1)
        self.wait(1)
        self.play(t1.animate.shift(UP * 3))

        self.next_section('part_1')

        circle = Circle().set_color(BLUE)
        self.play(FadeIn(circle))
        self.play(circle.animate.set_fill(BLUE, opacity=0.5), run_time=1)
        self.wait(1)

        self.next_section('part_2', skip_animations=True)

        square = Square().set_color(RED).set_fill(RED, opacity=0.5)
        self.play(ReplacementTransform(circle, square, run_time=1))
        self.play(square.animate.set_fill(RED, opacity=0))
        self.wait(1)

2.3.3 命令行标志

对于manim -pql example.py Example,其结构为manim [OPTIONS] FILE [SCENES]

OPTIONS就是一些参数标志,例如-p表示在渲染后预览视频,-ql代表分辨率854x480及15 FPS。更多的参数设置请参见第2.4.1节

SCENES为你创建的类名。如果一个文件中仅有一个类,则可以省略该类名。如果有多个类,则指定输出特定类,类与类之间用空格隔开,如manim -pql example.py ExampleOne ExampleTwo。如果要输出所有的类,可以不用一一指名,直接在OPTIONS中使用-a标志即可。注意,一个类就相当于一个成片,一次性输出多个类意味着输出多个独立的成片。