manim学习记录
manim学习记录
记录数据结构小学期实习的经历
为什么数据库不记录?因为太水了,我感觉没必要
manim环境配置
所需系统依赖
- FFmpeg (Windows 下安装需要自行配置 环境变量 )
- OpenGL (包含在 python 包
PyOpenGL
中,无需手动安装) - LaTeX (可选,如果需要 \(\LaTeX\) 则必需)
使用 python 环境安装 manimgl
1 | 通过 pip 安装 manimgl |
如果出现灰色窗口,控制台中出现一个iPython终端,环境就安装好了
manim项目结构
根据如下结构创建一个新的 .py
文件
1 | manim/ |
即需要将.py
文件放在与manimlib
同级目录下(但实际测试后发现并不需要这样,manimlib
成功import
进来就可以了)
然后在此目录下的控制台运行manimgl start.py
,就可以预览效果了
manimlib
在pip
安装位置,如果不清楚在哪里可以在控制台输入pip list -v
来查找目录
然后将其复制出来,放到对应项目文件夹中即可
manim命令行
命令行界面
manim运行动画时,需要在manimlib
同级目录下,在命令行中输入:
1 | manimgl <code>.py <Scene> <flags> |
<code>.py
: 写的 python 文件,可以使用绝对路径或相对于当前命令行所在路径的相对路径<Scene>
: 想要渲染的场景,或者一些场景。如果没有写或者写错,若文件中只有一个 Scene,会直接渲染这个类,否则会列出所有让你选择<flags>
: 传入的选项
如果不加<Scene>
且<code>.py
中只有一个场景Scene
,则会直接渲染这个场景
如果不加<flags>
,默认是低画质渲染并预览
常用选项
-w
把场景写入文件-o
把场景写入文件并打开-s
跳到最后只展示最后一帧-so
保存最后一帧并打开
-n <number>
跳到场景中第n
个动画,如-n 3
-f
打开窗口全屏-i
生成gif
全部选项
选项 | 简写 | 含义 |
---|---|---|
--help |
-h |
显示提示信息并退出 |
--version |
-v |
显示manimgl的版本 |
--write_file |
-w |
把场景渲染成视频文件 |
--skip_animations |
-s |
跳到最后一帧 |
--low_quality |
-l |
使用低质量渲染(默认 480p15) |
--medium_quality |
-m |
使用中等质量渲染(默认 720p30) |
--hd |
使用高质量渲染(默认 1080p30) | |
--uhd |
使用 4K 质量渲染 | |
--full_screen |
-f |
全屏呈现窗口 |
--presenter_mode |
-p |
场景将会在 wait 时暂停,等待用户按下空格或右方向键时继续播放(即幻灯片效果) |
--save_pngs |
-g |
把所有帧都保存为 png 文件 |
--gif |
-i |
把场景输出为 gif 文件 |
--transparent |
-t |
渲染 alpha 通道,视频为 mov 格式 |
--quiet |
-q |
|
--write_all |
-a |
渲染文件中的所有场景 |
--open |
-o |
保存文件后自动打开 |
--finder |
打开保存文件的文件夹 | |
--config |
进入自动配置指南 | |
--file_name FILE_NAME |
给输出文件重命名 | |
--start_at_animation_number START_AT_ANIMATION_NUMBER |
-n |
后面接两个数(逗号隔开)仅渲染一部分动画,如”3,6” |
--embed [EMBED] |
-e |
创建一个新文件,其中 self.embed 行插入到 Scenes
构造方法中。如果传入字符串,则该行将插入包含该字符串的最后一行代码下方。 |
--resolution RESOLUTION |
-r |
分辨率,传入格式为”WxH”, 如”1920x1080” |
--fps FPS |
视频帧率(整数) | |
--color COLOR |
-c |
背景颜色 |
--leave_progress_bars |
保持进度条留在终端中 | |
--video_dir VIDEO_DIR |
存放视频的目录 | |
--config_file CONFIG_FILE |
使用指定的配置文件 | |
--log-level LOG_LEVEL |
要显示的消息级别,可以是DEBUG / INFO / WARNING / ERROR / CRITICAL(调试/信息/警告/错误/严重) |
Manim Kindergarten入群问题
LaTeX方面遇到了问题,尝试加群以获取check_latex_packages.py
检查是否有包缺失
入群问题有两道考察Python基本语法的题,虽然没有Python语法基础,但在bing的帮助下快速上手了Python语法并且正确解答了问题,入群问题代码如下:
1 | import math |
可能遇到的问题
关于TextMobject
在一些古早的教程中,能看到TextMobject
这个类,在新版已经不存在了
旧版本中的 TexMobject
和 TextMobject
改了名字
TexMobject
改为了
Tex
,TextMobject
改为了
TexText
TexMobject
is renamed toTex
,TextMobject
is renamed toTexText
——官方开源文档whatsnew.rst
Tex
、TexText
、Text
三者之间的区别:
Tex
: 使用 \(LaTeX\) 的公式环境,使用 \(LaTeX\) 语法TexText
: 使用 \(LaTeX\) 的正文环境,使用 \(LaTeX\) 语法Text
: 使用manimpango
来生成 svg 文字,不使用 \(LaTeX\) 语法,可以更换字体
关于 LaTeX 的报错
在上手manim时,用TexText
类出现报错:LaTeX Error! Not a worry, it happens to the best of us.
最后一行还有FileNotFoundError: [Errno 2] No such file or directory
的报错
完整报错信息如下:
1 | ManimGL v1.6.1 |
我尝试在stackoverflow找了解决方案,有一条2021年的回答:LaTex
Error!
FileNotFoundError,里面提到了重装MikTex
,但是我本来就有texlive 2022
,没必要重装,于是就尝试找到解答
在哔哩哔哩专栏里找到一条评论:ManimGL折腾笔记,里面涉及到我这个问题的解决方案
回到问题本身:在ERROR前有一条WARNING,大意为没有指定temporary_storage
路径可能会导致错误,推荐设置一下这个路径
打开manimlib/default_config.yml
,第13到17行,Grant已经写的很清楚了:
1 | # Manim often generates tex_files or other kinds of serialized data |
意思是需要一个Temp文件夹存储临时文件,结合上文报错,就设置这个temporary_storage
还有一个要注意的问题是:我是用pip
下载的manim,然后把manimlib复制到别的文件夹中做动画的,更改这个文件应该修改pip
下载的manimlib目录下的配置文件,而不是修改项目对应目录的文件,可能是因为执行命令时查找的配置文件为pip
路径下的文件吧
关于字体问题
查看Text
中的font
有哪些可选项:
在Python 的终端中使用下面的命令可以查看可用的字体列表:
1 | import manimpango |
得到输出:
1 | ['Agency FB', 'Algerian', 'Arial', 'Arial Black', 'Arial Narrow', 'Arial Rounded MT Bold', 'Bahnschrift', 'Bahnschrift Condensed', 'Bahnschrift Light', 'Bahnschrift Light Condensed', 'Bahnschrift Light SemiCondensed', 'Bahnschrift SemiBold', 'Bahnschrift SemiBold Condensed', 'Bahnschrift SemiBold SemiConden', 'Bahnschrift SemiCondensed', 'Bahnschrift SemiLight', 'Bahnschrift SemiLight Condensed', 'Bahnschrift SemiLight SemiConde', 'Baskerville Old Face', 'Bauhaus 93', 'Bell MT', 'Berlin Sans FB', 'Berlin Sans FB Demi', 'Bernard MT Condensed', 'Blackadder ITC', 'Bodoni MT', 'Bodoni MT Black', 'Bodoni MT Condensed', 'Bodoni MT Poster Compressed', 'Book Antiqua', 'Bookman Old Style', 'Bradley Hand ITC', 'Britannic Bold', 'Broadway', 'Brush Script MT', 'Calibri', 'Calibri Light', 'Californian FB', 'Calisto MT', 'Cambria', 'Cambria Math', 'Candara', 'Candara Light', 'Cascadia Code', 'Cascadia Code ExtraLight', 'Cascadia Code Light', 'Cascadia Code SemiBold', 'Cascadia Code SemiLight', 'Cascadia Mono', 'Cascadia Mono ExtraLight', 'Cascadia Mono Light', 'Cascadia Mono SemiBold', 'Cascadia Mono SemiLight', 'Castellar', 'Centaur', 'Century', 'Century Gothic', 'Century Schoolbook', 'Chiller', 'Colonna MT', 'Comic Sans MS', 'Consolas', 'Constantia', 'Cooper Black', 'Copperplate Gothic Bold', 'Copperplate Gothic Light', 'Corbel', 'Corbel Light', 'Courier New', 'Curlz MT', 'Cursive', 'DejaVu Sans Mono', 'DengXian', 'Dubai', 'Dubai Light', 'Dubai Medium', 'Ebrima', 'Edwardian Script ITC', 'Elephant', 'Engravers MT', 'Eras Bold ITC', 'Eras Demi ITC', 'Eras Light ITC', 'Eras Medium ITC', 'FZShuTi', 'FZYaoTi', 'FangSong', 'Fantasy', 'Felix Titling', 'Footlight MT Light', 'Forte', 'Franklin Gothic Book', 'Franklin Gothic Demi', 'Franklin Gothic Demi Cond', 'Franklin Gothic Heavy', 'Franklin Gothic Medium', 'Franklin Gothic Medium Cond', 'Freestyle Script', 'French Script MT', 'Gabriola', 'Gadugi', 'Garamond', 'Georgia', 'Gigi', 'Gill Sans MT', 'Gill Sans MT Condensed', 'Gill Sans MT Ext Condensed Bold', 'Gill Sans Ultra Bold', 'Gill Sans Ultra Bold Condensed', 'Gloucester MT Extra Condensed', 'Goudy Old Style', 'Goudy Stout', 'Haettenschweiler', 'Harlow Solid Italic', 'Harrington', 'High Tower Text', 'HoloLens MDL2 Assets', 'Impact', 'Imprint MT Shadow', 'Informal Roman', 'Ink Free', 'Javanese Text', 'Jokerman', 'Juice ITC', 'KaiTi', 'Kristen ITC', 'Kunstler Script', 'LXGW WenKai', 'LXGW WenKai Mono', 'Leelawadee', 'Leelawadee UI', 'Leelawadee UI Semilight', 'LiSu', 'Lucida Bright', 'Lucida Calligraphy', 'Lucida Console', 'Lucida Fax', 'Lucida Handwriting', 'Lucida Sans', 'Lucida Sans Typewriter', 'Lucida Sans Unicode', 'MS Gothic', 'MS PGothic', 'MS Reference Sans Serif', 'MS UI Gothic', 'MV Boli', 'Magneto', 'Maiandra GD', 'Malgun Gothic', 'Malgun Gothic Semilight', 'Matura MT Script Capitals', 'Microsoft Himalaya', 'Microsoft JhengHei', 'Microsoft JhengHei Light', 'Microsoft JhengHei UI', 'Microsoft JhengHei UI Light', 'Microsoft New Tai Lue', 'Microsoft PhagsPa', 'Microsoft Sans Serif', 'Microsoft Tai Le', 'Microsoft Uighur', 'Microsoft YaHei', 'Microsoft YaHei UI', 'Microsoft YaHei UI Light', 'Microsoft Yi Baiti', 'MingLiU-ExtB', 'MingLiU_HKSCS-ExtB', 'Mistral', 'Modern No. 20', 'Mongolian Baiti', 'Monospace', 'Monotype Corsiva', 'Myanmar Text', 'NSimSun', 'Niagara Engraved', 'Niagara Solid', 'Nirmala UI', 'Nirmala UI Semilight', 'OCR A Extended', 'Old English Text MT', 'Onyx', 'PMingLiU-ExtB', 'Palace Script MT', 'Palatino Linotype', 'PangMenZhengDao-3', 'Papyrus', 'Parchment', 'Perpetua', 'Perpetua Titling MT', 'Playbill', 'Poor Richard', 'Pristina', 'Rage Italic', 'Ravie', 'Rockwell', 'Rockwell Condensed', 'Rockwell Extra Bold', 'STCaiyun', 'STFangsong', 'STHupo', 'STKaiti', 'STLiti', 'STSong', 'STXihei', 'STXingkai', 'STXinwei', 'STZhongsong', 'Sans', 'Script MT Bold', 'Segoe MDL2 Assets', 'Segoe Print', 'Segoe Script', 'Segoe UI', 'Segoe UI Black', 'Segoe UI Emoji', 'Segoe UI Historic', 'Segoe UI Light', 'Segoe UI Semibold', 'Segoe UI Semilight', 'Segoe UI Symbol', 'Serif', 'Showcard Gothic', 'SimHei', 'SimSun', 'SimSun-ExtB', 'Sitka Banner', 'Sitka Display', 'Sitka Heading', 'Sitka Small', 'Sitka Subheading', 'Sitka Text', 'Snap ITC', 'Stencil', 'Sylfaen', 'System-ui', 'Tahoma', 'Tempus Sans ITC', 'Times New Roman', 'Trebuchet MS', 'Tw Cen MT', 'Tw Cen MT Condensed', 'Tw Cen MT Condensed Extra Bold', 'Verdana', 'Viner Hand ITC', 'Vivaldi', 'Vladimir Script', 'Wide Latin', 'YouYuan', 'Yu Gothic', 'Yu Gothic Light', 'Yu Gothic Medium', 'Yu Gothic UI', 'Yu Gothic UI Light', 'Yu Gothic UI Semibold', 'Yu Gothic UI Semilight', 'ZWAdobeF'] |
微软雅黑:Microsoft YaHei
霞鹜文楷:LXGW WenKai
庞门正道:PangMenZhengDao-3
但是不知道为什么,使用庞门正道字体就会出现报错,使用霞鹜文楷就没事,是字体bug吗?
关于 Python 基础语法的问题
虽然有 C, C++, Java 语言的基础,但是因为没系统地学过 Python 这门编程语言,所以涉及到基础语法的问题我会在此记录
Python
中函数调用时传递参数前加*
和**
在 Python 中,*
和 **
语法用于在函数调用时传递参数
- 当一个可迭代对象(如列表或元组)作为函数参数传递时,可以在对象前面加上一个星号
*
。这样做会将可迭代对象中的元素作为位置参数(相当于C++中函数的值传递)传递给函数。例如,如果有一个列表my_list = [1, 2, 3]
,并且希望将其元素作为位置参数传递给函数my_function
,则可以使用my_function(*my_list)
语法 - 当一个字典作为函数参数传递时,可以在字典前面加上两个星号
**
。这样做会将字典中的键值对作为关键字参数传递给函数。例如,如果您有一个字典my_dict = {'a': 1, 'b': 2}
,并且希望将其键值对作为关键字参数传递给函数my_function
,则可以使用my_function(**my_dict)
语法
这两种语法都可以让我们更方便地传递多个参数,而不需要显式地指定每个参数的名称和值
例如:
1 | def my_function(a, b, c, d): |
输出为
1 | a = 1, b = 2, c = 3, d = 4 |
首先看my_function
函数,里面只有print()
函数
在 Python 中,f
是格式化字符串的前缀。当在字符串前面加上
f
字符时,它表示这是一个格式化字符串
格式化字符串可以让您在字符串中嵌入表达式,这些表达式将在运行时被计算并替换为它们的值。要在格式化字符串中嵌入表达式,只需将表达式放在大括号
{}
中即可
例如代码中,f'a = {a}, b = {b}, c = {c}, d = {d}'
是一个格式化字符串。其中,{a}
、{b}
、{c}
和 {d}
都是表达式,它们将在运行时被计算并替换为它们的值
假设变量 a
、b
、c
和
d
的值分别为 1
、2
、3
和 4
,则上面的格式化字符串将被计算为
'a = 1, b = 2, c = 3, d = 4'
。
格式化字符串是一种非常方便的语法,可以快速地将变量和表达式嵌入到字符串中
再看调用过程,创建了一个数组和一个字典
带入函数时,a, b
被数组赋值,分别为1, 2
;c, d
被字典中键值对赋值,分别为3, 4
带入参数的字典必须符合函数中定义的形参,不能多也不能少,如示例中函数给定参数为a, b, c, d,带入字典就只能有这四个,不能多一个字母,本质上就是拿字典来代替手动输入参数
但是如果函数的参数中有**
,那就是一个可变关键字参数,允许传递任意数量的关键字参数给函数,此时字典里可以有任意个键值对
如:
1 | class MyClass: |
Prim算法演示动画制作记录
本次动画制作参考了Manim Kindergarten制作的manim教学系列视频
制作过程中用到了Manim
Kindergarten的一些实用工具,主要用到了随机动画,但其中有些函数,比如Unwrite
有问题,所以我给注释掉了,因为年代有点久远,跟现版本有些不相容,在此基础上做了些修改
修改完的RandomScene.py
放在了项目同级目录下,在.py
文件中import
成功,但是命令行执行过程中失败了,挺奇怪的,在
VS Code
中按Ctrl
点击这些函数都能正常找到,但就是编译不成功
可能是manimgl
指令的问题,会从pip
目录里找
文字降噪点
用的霞鹜文楷,文字会出现噪点,如下图第一行
但是对文字调用set_stroke(width=1.5, color=COLOR)
函数,就会发现噪点消失了
颜色换成背景色或者文字的颜色就看不出来边框

1 | font_xw = "LXGW WenKai" |
我猜原因是设置笔画宽度把噪点部分忽略了
具体动画制作过程应该没有什么太多需要注意的,一开始本来想调用开源社区的库,但是最后还是算了
因为更大的问题出现了
次回予告:
新的任务,对团队加倍压榨,实习与生活的双重打击将我们几乎彻底压垮,快给予我们希望!
下一集,致以辉煌之人
Project Gyakuten
离最终汇报答辩还有3天,我们被告知项目有问题:不能单纯只做一个视频,需要结合用户输入
也就是说动画做再好也不满足这次实训的要求
虽然我们自认为动画做的还是很好的,毕竟用的可是manim
,当时看到实训有
“动画演示”
这个题目,我想都没想就选这个了,然而他确实不是只做一个动画就行了,哇!哈!哈!这下快寄了
当然,所谓觉悟并不是看到死线和失败的自暴自弃,而是在现有优秀动画基础上开拓出应当前进的道路
没办法,只能在有限的时间里尽可能做到极致了
总体思路
跟孙海天老师讨论了以后,决定采用以下方法:
程序开始的时候先把这个图打出来:

然后让用户输入来指定留哪些结点和边,然后可以输入边的权重
以此为基础,生成最小生成树的动画演示
或许还能用ffmpeg来把Prim算法和Kruskal算法的两段视频拼起来?可以考虑一下
1 | Project Gyakuten/ |
我给项目取名叫Project Gyakuten,灵感来自逆转裁判,因为我们现在离答辩已经只剩3天了,而现在又在谷底,如果成功了,就是华丽的逆转
准备工作
在一切重新启动,ゼロからonce again之前,需要做充分的准备:
C++调Python语句
首先,可能会用到C++调用Python的情况,问了bing以后得知有<Python.h>
这个库可以调用,这个库在Python安装目录的include
目录里可以找到,如C:\Users\WinkySpeed\AppData\Local\Programs\Python\Python39\include
给项目添加库,老操作了,可以参照SFML库安装教程进行项目的配置:
此处放include
目录

此处放libs
文件夹,也在Python安装目录下

此处放.lib
文件

打开上文的libs
目录
发现只有python39.lib, python3.lib, _tkinter.lib
这三个文件,并没有找到名字带-d
的文件,那在VS里只能用Release
模式了
将这些文件添加到附加依赖项中,再运行就可以正常执行Python解释器了
C++执行cmd命令行语句
这个还是比较容易的,<cstdlib>
中的system()
函数就可以做到调用命令行
测试代码如下
1 |
|
即用C++启动命令行执行manimgl Prim.py
语句
如下图,成功了
