【manim】之滚动字幕

概要

manim 是一个做数学视频的 python 库,这个库功能非常强大。
具体可以参考官方介绍:https://github.com/ManimCommunity/manim/

它本身只是封装数学相关的几何体和一些基础动画,所以,制作视频时,需要进一步封装更复杂的动画来满足视频的要求。
最近做的一个视频有很多公式推导,所以封装了一个滚动字幕的组件。

代码封装

核心代码如下:

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

class text_displayer:
    """
    字幕替换封装
    """

    def __init__(
        self, sc: Scene, arr, start_position=UP * 3, display_length=1, buff=0.5
    ) -> None:
        """
        初始化

        Parameters
        ---------
        sc
            绘制字幕的场景
        arr
            字幕列表,是 list 类型
        start_position
            字幕开始位置,默认位置偏上 UP*3
        display_length
            最多显示字幕行数,超出时则隐藏最早的那一行,其他行相应移动位置
        buff
            每行字幕间隔的位置
        """
        self.sc = sc  # 当前场景
        self.text_arr = arr  # 所有文本
        self.start_position: int = start_position  # 开始显示的位置
        self.display_length: int = display_length  # 最多显示的行数
        self.buff = buff  # 每行文本之间的间隔
        self.cur_index: int = 0  # 当前的index

    def next(self) -> bool:
        if self.cur_index >= len(self.text_arr):
            return False

            # 是否需要上移
        if self.cur_index >= self.display_length:  # 已达到显示的最大值
            # 清除第一层的文字
            self.sc.play(FadeOut(self.text_arr[self.cur_index - self.display_length]))

            # 上移已有的文字
            for i in range(self.display_length - 1, 0, -1):
                self.sc.play(
                    self.text_arr[self.cur_index - i].animate.move_to(
                        self.start_position
                        + DOWN * (self.display_length - 1 - i) * self.buff
                    )
                )

            # 显示当前行
            d = self.cur_index // self.display_length
            if d == 0:
                self.sc.play(
                    Write(
                        self.text_arr[self.cur_index].shift(
                            self.start_position - UP * self.buff * self.cur_index
                        )
                    )
                )
            else:
                self.sc.play(
                    Write(
                        self.text_arr[self.cur_index].shift(
                            self.start_position - UP * self.buff * (self.display_length - 1)
                        )
                    )
                )

            self.cur_index += 1
            return True

整体比较简单,通过初始化函数 __init__设置相关的参数,然后不断调用 next()方法显示字幕,直至返回 False为止。

测试效果

测试代码如下:

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


class Example(Scene):
    def construct(self):
        arr = [
            Text("第一行", color=RED),
            Text("第二行", color=YELLOW),
            Text("第三行", color=BLUE),
            Text("第四行", color=RED),
            Text("第五行", color=YELLOW),
            Text("第六行", color=BLUE),
            Text("第七行", color=RED),
            Text("第八行", color=YELLOW),
        ]

        # 最多显示一行
        td = text_displayer(self, arr, start_position=UP, display_length=1)

        # 最多显示三行
        # td = text_displayer(self, arr, start_position=UP, display_length=3)

        while td.next():
            pass

最多显示一行的效果如下:
out.gif

最多显示三行的效果:
out.gif

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【manim】之滚动字幕 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 数据采集实战(六)– 新浪新闻

    1. 概述 新闻是我们了解外界的重要渠道,以前,我们一般通过报纸和电视来获取新闻,那时候,获取新闻不仅有一定的成本,效率还不高。 而如今,获取新闻的途径太多太方便了,大量重复的新闻充斥着各大平台,获取新闻已经没有什么成本,问题变成了过滤和鉴别新闻的可信程度。 下面用 【新浪新闻】 作为采集对象,抛砖引玉,演示下新闻从采集到分析的整个过程。 2. 采集流程 主…

    2023年4月2日
    00
  • 【manim】之圆规动画

    概要 前端时间做尺规作图相关的动画的时候,封装了一个圆规的动画,顺便研究了下 manim 库的动画函数。 manim 本身就是做动画的库,所以,基于它封装自定义的动画非常方便。 动画原理 对于单个的元素,manim本身就提供了非常多的动画函数。比如:创建/消除的动画,移动元素的动画,旋转元素的动画等等,具体可以参考: Animations 如果是做一些简单的…

    2023年3月31日
    00
  • matplotlib可视化系列之【排版】

    排版虽然只是绘图中的辅助功能,但是好的排版能够提高图形的表现力。让人一眼看出图形要表达的内容和数据,而不用去费力的睁大眼睛去图中查找。 如果说 matplotlib的坐标系统,各种基础元素,包括柱状图,折线图,散点图等它的硬实力,那么,排版就是 matplotlib 的软实力,结合排版,能让分析结果给人一个良好的第一印象,增强别人对分析结果的信任。 排版是个…

    2023年4月2日
    00
  • 【manim动画教程】– 坐标系

    没有引入坐标系之前,在绘制图形时,也有一个隐含的坐标系,它和屏幕的像素相关。 比如,我们之前示例中的各个图形,屏幕的中心就是坐标原点([0, 0]),横轴坐标的范围大概是 [-3.5, 3.5],纵轴的坐标范围大概是 [-4, 4],这个范围与设置的视频分辨率有关,分辨率设置的越高的话,坐标范围越大。 不知是否还记得,之前的文章中绘制的线或者多边形(比如这个…

    python 2023年4月18日
    00
  • 【manim动画教程】–高级动画效果

    在常用的动画效果中,介绍了一些元素的创建,销毁,移动和变换的方法,这些方法都是针对单个动画的。如果需要多个动画互相关联,或者元素需要有更复杂的运动方式,那么,仅仅依靠常用的动画效果可能就无法满足要求了。 本篇的高级动画效果主要介绍一些更加灵活的元素运动方式,如何组合多个动画,以及如何联动多个动画的方式。掌握了这些方法,就能够表达出更加复杂的数学几何动画。 1…

    python 2023年4月17日
    00
  • 云环境自动化(Terraform+Ansible)

    应用的自动化部署由来已久,也有很多知名的工具,比如puppet,ansible,saltstack,chef等等。但是对于基础设施部分,一般都是以事先准备的方式来提供的。 虽然各大云服务器厂商也逐步提供了各类的API,用来控制自己的基础设施,但是,由于各类厂商的差异性,API差异很大且没有统一分类标准,兼容各个云环境的难度非常大。 不过,随着Terrafor…

    云计算 2023年4月18日
    00
  • 【pandas基础】–数据读取

    数据读取是第一步,只有成功加载数据之后,后续的操作才有可能。 pandas可以读取和导入各种数据格式的数据,如CSV,Excel,JSON,SQL,HTML等,不需要手动编写复杂的读取代码。 1. 各类数据源 pandas提供了导入各类常用文件格式数据的接口,这里介绍3种最常用的加载数据的接口。 1.1 从 CSV 文件读取数据 读取csv文件的接口:rea…

    python 2023年5月4日
    00
  • 【manim动画教程】–相机

    相机(Camera)在二维的场景下使用不多,一般在3D场景中提及的比较多。相机相当于我们看动画的视角,简单来理解的话,相当于我们的眼睛(实际情况会复杂一些,相机还有其他一些辅助功能)。 默认的相机焦点在屏幕的中心位置,相机默认是以俯视的视角查看所有的元素。之前的介绍的常用动画效果和高级动画效果,都没有对相机进行调整过,所以,是通过移动和变换各个元素来实现动画…

    python 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部