概要
最近,结合视频剪辑工具剪映制作短视频时,
如果不是数学相关的内容,使用视频剪辑工具配置字幕,添加图片等等比 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