常见问题:一般用法

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

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

否则,您可能混淆了Manim版本。请参阅此FAQ答案了解为什么存在不同版本的解释。假设您正在尝试使用终端中的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参数,将未处理的参数传递给下一个基类——依此类推。

与样式化你的mobjects相关的最重要的关键字参数是那些在基类VMobjectMobject中记录的参数。


Manim 可以渲染带有透明背景的视频吗?

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


我看过一个视频,其中创作者运行了命令X,但对我无效。为什么?

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


当使用TexMathTex时,一些字母缺失。如何解决这个问题?

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

fmtutil -sys --all

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


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

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

在此之前,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 FAQ


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

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