常见问题:一般用法

为什么 Manim 说“该模块中没有场景”?

出现此错误主要有两个原因:如果您编辑了包含 Scene 类的文件但忘记保存,或者您不小心将错误的文件名传递给了 manim,这很可能是结果。请检查您是否正确拼写了所有内容。

否则,您很可能混淆了 Manim 版本。请参阅此常见问题解答,了解为什么存在不同版本。假设您正尝试使用终端中的 manim 可执行文件来运行为社区版本编写的场景(即有 from manim import *,或更具体地说是 from manim import Scene),那么此错误表明 manim 可执行文件已被 manimgl 提供的同名文件覆盖(不幸的是,manimmanimgl 都提供了一个名为 manim 的可执行文件)。

您可以通过运行 manim --version 来检查是否如此,社区维护版本的输出以 Manim Community v... 开头。如果不是这种情况,则您正在运行 manimgl

您可以通过以下任一步骤解决此问题:

  • 卸载并重新安装 manim

  • 使用 manimce 可执行文件代替 manim

  • 或者通过 python -m manim 直接调用 Python 模块来替换对可执行文件的调用。


无论我在文件中放入什么代码,Manim 都只渲染一个黑框!为什么?

如果您正在使用通常的模式编写 Scene,即:

class MyAwesomeScene(Scene):
    def construct(self):
        ...
        # your animation code

那么请仔细检查您是否正确拼写了 construct。如果包含您代码的方法不叫 construct(或者您没有从 construct 调用不同的自定义方法),Manim 将不会调用您的方法,而只会输出一个黑框。


Manim 场景的默认尺寸是多少?

场景高度为 8 个单位,默认宽高比为 16:9,这意味着其宽度为 \(8 \cdot 16 / 9 = 14 + 2/9\) 个单位。原点位于场景中心,这意味着,例如,场景的左上角坐标为 [-7-1/9, 4, 0]


如何找出创建 Mobject 时可以传递哪些关键字参数?

让我们考虑一个具体的例子,比如 Circle 类。查看其文档页面时,只列出了两个具体的关键字参数(radiuscolor)。除了这些具体参数之外,还有一个包罗万象的 **kwargs 参数,它捕获所有传递给 Circle 的其他参数,并将其传递给 Circle 的基类 Arc

Arc 也是如此:有些参数有明确的文档说明,并且再次有一个包罗万象的 **kwargs 参数,它将未处理的参数传递给下一个基类——依此类推。

与设置 Mobject 样式相关的最重要关键字参数是为基类 VMobjectMobject 记录的参数。


Manim 能否渲染带有透明背景的视频?

可以:只需传递 CLI 标志 -t(或其长格式 --transparent)。请注意,默认视频文件格式不支持透明度,这就是为什么 Manim 在渲染透明背景时会输出 .mov 而不是 .mp4。支持透明度的其他视频文件格式可以通过传递 --format=webm--format=gif 获得。


我看了个视频,创作者运行了命令 X,但对我不起作用。为什么?

您观看的视频可能已过时。如果您想跟着操作,您需要使用视频中使用的相同版本,或者相应地修改代码(在许多情况下,只是方法被重命名等)。请查看视频说明,在某些情况下,创作者会指出是否需要对视频中显示的代码进行更改。


使用 TexMathTex 时,有些字母缺失。我该如何解决?

您可能需要(重新)构建 LaTeX 使用的一些字体。对于某些发行版,您可以通过运行以下命令手动完成此操作:

fmtutil -sys --all

我们建议您查阅您的 LaTeX 发行版文档以获取更多信息。


我想将一些代码从 manimgl 迁移到 manim,我该如何处理 CONFIG 字典?

社区维护版本很早就放弃了 CONFIG 字典的使用,v0.2.0 版本于 2021 年 1 月发布。

在此之前,Manim 的类基本上通过模仿继承(以正确处理父类设置的 CONFIG 字典)然后将字典中的所有键值对作为相应对象的属性来处理 CONFIG 字典。

在没有太多继承的情况下,或者对于任何自定义设置,您应该自行设置这些属性。例如,对于具有自定义属性的旧式 Scene,例如:

class OldStyle(Scene):
    CONFIG = {"a": 1, "b": 2}

应该写成:

class NewStyle(Scene):
    a = 1
    b = 2

在值应该被正确继承的情况下,参数应该添加到类的初始化函数中。一个旧式 Mobject Thing 可能如下所示:

class Thing(VMobject):
    CONFIG = {
        "stroke_color": RED,
        "fill_opacity": 0.7,
        "my_awesome_argument": 42,
    }

其中 stroke_colorfill_opacity 是与 Thing 的父类相关的参数,而 my_awesome_argument 是一个仅与 Thing 相关的自定义参数。不使用 CONFIG 的版本可能如下所示:

class Thing(VMobject):
    def __init__(
        self, stroke_color=RED, fill_opacity=0.7, my_awesome_argument=42, **kwargs
    ):
        self.my_awesome_argument = my_awesome_argument
        super().__init__(stroke_color=stroke_color, fill_opacity=fill_opacity, **kwargs)

我的安装不支持将 PDF 转换为 SVG,求助?

这是 dvisvgm 的问题,它是 LaTeX 附带的工具,用于将 LaTeX 输出转换为 Manim 可以解析的 .svg 文件。

首先,通过检查以下命令的输出来确保您的 dvisvgm 版本至少为 2.4:

dvisvgm --version

如果您不知道如何更新 dvisvgm,请参阅您的 LaTeX 发行版文档(或者如果 dvisvgm 是作为系统包安装的,则参阅您操作系统的文档)。

其次,检查您的 dvisvgm 是否支持 PostScript 特殊功能。这是将 PDF 转换为 SVG 所必需的。运行:

dvisvgm -l

如果此命令的输出包含 ps  dvips PostScript specials,则这是一个不好的迹象。在这种情况下,运行:

dvisvgm -h

如果输出包含 --libgs=filename,则表示您的 dvisvgm 当前不支持 PostScript。您必须获取另一个二进制文件。

但是,如果帮助中出现 --libgs=filename,则表示您的 dvisvgm 需要 Ghostscript 库来支持 PostScript。请搜索 libgs.so(在 Linux 上,可能在 /usr/local/lib/usr/lib 中)或 gsdll32.dll(在 32 位 Windows 上,可能在 C:\windows\system32 中)或 gsdll64.dll(在 64 位 Windows 上,也可能在 C:\windows\system32 中)或 libgsl.dylib(在 MacOS 上,可能在 /usr/local/lib/opt/local/lib 中)。请仔细查找,因为文件可能位于其他位置,例如 Ghostscript 的安装目录中。

找到库后,尝试(在 MacOS 或 Linux 上):

export LIBGS=<path to your library including the file name>
dvisvgm -l

或(在 Windows 上):

set LIBGS=<path to your library including the file name>
dvisvgm -l

您现在应该在输出中看到 ps    dvips PostScript specials。请查阅您操作系统的文档,了解如何在每次打开 shell 时自动设置或导出环境变量 LIBGS

作为最后检查,您可以运行:

dvisvgm -V1

(当然,前提是 LIBGS 仍然设置为正确的路径。)如果 dvisvgm 能够找到您的 Ghostscript 安装,它将与版本号一起显示在输出中。

如果您的系统上没有必要的库,请查阅您操作系统的文档,了解在哪里可以获取它以及如何安装它。

如果您无法解决问题,请查阅 dvisvgm 常见问题


我在哪里可以找到更多学习 Manim 的资源?

在我们的 Discord 服务器中,我们有一个社区维护的 #beginner-resources 频道,其中收集了有用的学习资源链接。欢迎您加入我们的 Discord 并自行查看!如果您自己找到了一些尚未列入我们列表的指南或教程,请随时添加它们!