【manim】之目录动画,所以,用manim封


概要

最近,结合视频剪辑工具剪映制作短视频时,
如果不是数学相关的内容,使用视频剪辑工具配置字幕,添加图片等等比 manim更加方便。

所以,用 manim封装一个目录的动画,用来配合剪辑工具中的其他资源。

代码封装

基于manim封装一个目录显示的 class
主要属性就是 titles,也就是目录中的各个标题。

class CatalogDisplayer:
    def __init__(self, sc: Scene, titles: list):
        self.sc = sc
        self.titles = titles

    def _title(self):
        title = Text("目录", font_size=20, weight=BOLD).shift(UP * 3.5)
        line = Line(LEFT * 3, RIGHT * 3, color=WHITE, stroke_width=3).next_to(
            title, DOWN * 0.5
        )
        self.sc.add(title, line)

    def _get_paragraph(self, index: int):
        catalog = Paragraph(
            *self.titles,
            line_spacing=1,
            alignment="left",
            font_size=30,
            font="STLiti",
            weight=BOLD,
        )

        catalog[index].set_color_by_gradient(RED, BLUE, GREEN)
        for i in range(len(self.titles)):
            if i != index:
                catalog[i].set_color(GREY)

        return catalog

    def _start(self):
        catalog = self._get_paragraph(0)
        self.sc.add(catalog)
        self.sc.play(Indicate(catalog[0], scale_factor=1.5, color=GREEN))

    def display(self, index: int) -> bool:
        if index >= len(self.titles):
            return False

        self.sc.clear()
        self._title()

        if index == 0:
            self._start()
            return True

        pre_catalog = self._get_paragraph(index - 1)
        self.sc.add(pre_catalog)

        catalog = self._get_paragraph(index)
        self.sc.play(ReplacementTransform(pre_catalog, catalog))
        self.sc.play(Indicate(catalog[index], scale_factor=1.5, color=GREEN))

        return True

调用的示例如下:

# -*- coding: utf-8 -*-
from manim import *

TITLES = [
    "· manim是什么",
    "· 多平台支持",
    "· 基于python",
    "· 重要依赖",
]


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

        catalog = CatalogDisplayer(self, TITLES)
        for i in range(len(TITLES)):
            catalog.display(i)
            self.wait()
            self.clear()

如果不是第一个标题,会有一个简单的过渡效果。

测试效果

manim -p ./sample.py

评论关闭