Manim MK.Ver With VSCode

背景与此指南的特点

近期由于想要实现复变函数的可视化以及有关向量场的渲染,捡起来了许久没用的manim又搞了一发配置,这里将其相关配置方法给出。

此方法较常规方法,如pip install manimgl的优势主要有:

  • 可以结合使用VSCode进行运行中调试
  • 新版本(OpenGL)与老版本(cairo)共存,同时使用互不影响
  • 支持代码分析器进行自动补全、定义跳转
  • 不改动代码仓库代码,支持随时更新至最新版本
  • 配置文件分离且支持自行配置
  • 全部项目和仓库文件均存放在同一文件夹下,便于管理
  • 任意子文件夹中的代码文件均可直接渲染,无需关注路径配置
  • 利用VSCode运行和调试配置的高扩展性同时支持众多功能选择

此指南重点关注VSCode的配置,对于manim所需支持库和LaTeX的安装由于篇幅有限恕不详细给出。

本指南由Manim Kindergarten成员GZTime提供。
教程中均使用manim-kindergarten所Fork及针对性优化的manim版本。
我们将会保障最新版本的及时更新与可用性。
查阅更多教程欢迎访问由MK成员维护的manim中文教程文档
同时欢迎在Bilibili关注我们的最新动态及相关作品!

Steps

VSCode扩展及文件夹准备

在开始配置之前,你需要完成以下工作及准备:

  • 安装好VSCode
  • 配置好pythonffmpegLaTeXgit并安装好运行manim所必须的软件(详见其他指南)
  • 在合适的地方创建一个合适的文件夹,我们预计的最终文件目录将会是如下的结构:
    ├─ .vscode/
    ├─ code/
    ├─ export/
    ├─ manim/
    ├─ manim_old/
    └─ custom_config.yml

配置过程中尽量避免使用中文路径!文件结构均可自由配置,并无统一标准,如有需求可以自行更改并配置。

克隆代码仓库

首先你需要从manim-kindergarten克隆所需的代码仓库。

在VSCode打开你的根目录,并按下CTRL + `,在当前文件夹根目录下打开终端,运行如下命令:

git clone https://github.com/3b1b/manim.git manim
git clone https://github.com/manim-kindergarten/manim.git manim_old

如果一切顺利,在你的manim_old文件夹中将会存有老版本的manim代码(ver.MK分支),而新版本将会位于manim文件夹中。老版本文件夹下会存在manim.py而新版本则会存在setup.py文件。

配置插件

你需要安装如下插件:

安装完成后根据VSCode的提示选择你的Python路径。

在确保路径正确后打开.vscode/settings.json并插入:

"python.analysis.extraPaths": [
    "manim",
    "manim_old",
],
"python.languageServer": "Pylance",

配置custom_config.yml

请将directories.output设置为当前根目录下的export文件夹的绝对路径。
请将directories.temporary_storage设置为当前根目录下的export/temp文件夹的绝对路径。

其余配置请参照./manim/manimlib/default_config.yml进行配置。

配置launch.json

这是最重要的一步,其中的某些配置依赖于当前MK所Fork的代码,我们将会尽早将其整合后提交PR。

相关代码已经合并至3b1b/manim,因此可以直接使用。此处我取出一部分解释其配置。

配置项

老版本配置项:

{
  "name": "Preview manim_old", // manim 旧版本预览
  "type": "python",
  "request": "launch",
  "cwd": "${workspaceFolder}/manim_old", // 设置当前工作路径
  "env": {
    "PYTHONPATH": "${workspaceFolder}/manim_old" // 设置Python运行环境变量
  },
  "program": "${workspaceFolder}/manim_old/manim.py", // 设置运行程序
  "console": "integratedTerminal", // 使用vsc内置终端
  "args": [
    "${file}", // 当前文件路径
    "-m", // 中等画质
    "-p", // 启用预览
    "--media_dir", // 输出文件参数
    "${workspaceFolder}/export" // 输出文件路径
  ]
}

新版本配置项:

{
  "name": "Preview manim", // manim 预览
  "type": "python",
  "request": "launch",
  "cwd": "${workspaceFolder}/manim", // 设置当前工作路径
  "env": {
    "PYTHONPATH": "${workspaceFolder}/manim" // 设置Python运行环境变量
  },
  "program": "${workspaceFolder}/manim/manimlib/__main__.py", // 设置运行程序
  "console": "integratedTerminal", // 使用vsc内置终端
  "args": [
    "${file}", // 当前文件路径
    "--config_file", // 配置文件参数
    "${workspaceFolder}/custom_config.yml" // 配置文件路径
  ]
}

原因详解

以下内容均已被3b1b/manim所合并。

其中由于新版本的特殊性,在__main__.py中添加了如下内容以确保成功启动调试。

if __name__ == '__main__':
    main()

并且对config.py进行更改使其兼容外部路径的配置文件输入,因此,对于原版本暂时没有--config_file选项的支持。

配置文件下载

此处提供旧版本、新版本各4条配置项,对应不同的参数和功能:

  • manim 预览
  • manim 1080p@30 渲染
  • manim 4k@60 渲染
  • manim 导出最后一帧

你可以在Gist查看或下载此配置文件。
你可以在附录查看或复制此配置文件。

测试配置结果

manim

在目录/code/shaders中创建Test.py并写入:

from manimlib import *

class TestScene(Scene):
    def construct(self):
        square = Square()
        square.set_fill(BLUE_E, 1)
        self.add(square)
        self.play(square.animate.scale(2),rate_func=there_and_back,run_time=2)
        self.wait()
        self.play(square.animate.set_width(5, stretch=True),run_time=3,)
        self.wait()
        self.play(square.animate.set_width(2),run_time=3)
        self.wait()
        self.wait(2)

选择Preview manim,并按F5或绿色箭头开始调试。

manim_old

在目录/code/old中创建Test.py并写入:

from manimlib.imports import *

class TestScene(Scene):
    def construct(self):
        circle = Circle()
        square = Square()
        square.flip(RIGHT)
        square.rotate(-3 * TAU / 8)
        circle.set_fill(PINK, opacity=0.5)

        self.play(ShowCreation(square))
        self.play(Transform(square, circle))
        self.play(FadeOut(square))

选择Preview manim_old,并按F5或绿色箭头开始调试。

附录

launch.json

{
  // 使用 IntelliSense 了解相关属性。
  // 悬停以查看现有属性的描述。
  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Preview manim", // manim 预览
      "type": "python",
      "request": "launch",
      "cwd": "${workspaceFolder}/manim", // 设置当前工作路径
      "env": {
        "PYTHONPATH": "${workspaceFolder}/manim" // 设置Python运行环境变量
      },
      "program": "${workspaceFolder}/manim/manimlib/__main__.py", // 设置运行程序
      "console": "integratedTerminal", // 使用vsc内置终端
      "args": [
        "${file}", // 当前文件路径
        "--config_file", // 配置文件参数
        "${workspaceFolder}/custom_config.yml" // 配置文件路径
      ]
    },
    {
      "name": "Render manim", // manim 渲染 1080p@30
      "type": "python",
      "request": "launch",
      "cwd": "${workspaceFolder}/manim", // 设置当前工作路径
      "env": {
        "PYTHONPATH": "${workspaceFolder}/manim" // 设置Python运行环境变量
      },
      "program": "${workspaceFolder}/manim/manimlib/__main__.py", // 设置运行程序
      "console": "integratedTerminal", // 使用vsc内置终端
      "args": [
        "${file}", // 当前文件路径
        "--hd", // --hd选项 使用 1080p@30
        "-w", // 写入文件
        "-o", // 完成后打开
        "--config_file", // 配置文件参数
        "${workspaceFolder}/custom_config.yml" // 配置文件路径
      ]
    },
    {
      "name": "Render manim 4k", // manim 渲染 4k@60
      "type": "python",
      "request": "launch",
      "cwd": "${workspaceFolder}/manim", // 设置当前工作路径
      "env": {
        "PYTHONPATH": "${workspaceFolder}/manim" // 设置Python运行环境变量
      },
      "program": "${workspaceFolder}/manim/manimlib/__main__.py", // 设置运行程序
      "console": "integratedTerminal", // 使用vsc内置终端
      "args": [
        "${file}", // 当前文件路径
        "--uhd", // --uhd选项 使用 4k@60
        "-w", // 写入文件
        "-o", // 完成后打开
        "--config_file", // 配置文件参数
        "${workspaceFolder}/custom_config.yml" // 配置文件路径
      ]
    },
    {
      "name": "Export manim picture", // manim 导出最后一帧 4k
      "type": "python",
      "request": "launch",
      "cwd": "${workspaceFolder}/manim", // 设置当前工作路径
      "env": {
        "PYTHONPATH": "${workspaceFolder}/manim" // 设置Python运行环境变量
      },
      "program": "${workspaceFolder}/manim/manimlib/__main__.py", // 设置运行程序
      "console": "integratedTerminal", // 使用vsc内置终端
      "args": [
        "${file}", // 当前文件路径
        "--uhd", // --uhd选项 使用 4k@60
        "-w", // 写入文件
        "-o", // 完成后打开
        "-s", // 跳过动画
        "--config_file", // 配置文件参数
        "${workspaceFolder}/custom_config.yml" // 配置文件路径
      ]
    },
    {
      "name": "Preview manim_old", // manim 老版本 低画质预览
      "type": "python",
      "request": "launch",
      "cwd": "${workspaceFolder}/manim_old", // 设置当前工作路径
      "env": {
        "PYTHONPATH": "${workspaceFolder}/manim_old" // 设置Python运行环境变量
      },
      "program": "${workspaceFolder}/manim_old/manim.py", // 设置运行程序
      "console": "integratedTerminal", // 使用vsc内置终端
      "args": [
        "${file}", // 当前文件路径
        "-m", // 中等画质
        "-p", // 启用预览
        "--media_dir", // 输出路径参数
        "${workspaceFolder}/export" // 输出文件路径
      ]
    },
    {
      "name": "Render manim_old", // manim 老版本 渲染
      "type": "python",
      "request": "launch",
      "cwd": "${workspaceFolder}/manim_old", // 设置当前工作路径
      "env": {
        "PYTHONPATH": "${workspaceFolder}/manim_old" // 设置Python运行环境变量
      },
      "program": "${workspaceFolder}/manim_old/manim.py", // 设置运行程序
      "console": "integratedTerminal", // 使用vsc内置终端
      "args": [
        "${file}", // 当前文件路径
        "-p", //预览参数
        "--media_dir", // 输出路径参数
        "${workspaceFolder}/export" // 输出文件路径
      ]
    },
    {
      "name": "Render 4k manim_old", // manim 老版本 渲染 4k@60
      "type": "python",
      "request": "launch",
      "cwd": "${workspaceFolder}/manim_old", // 设置当前工作路径
      "env": {
        "PYTHONPATH": "${workspaceFolder}/manim_old" // 设置Python运行环境变量
      },
      "program": "${workspaceFolder}/manim_old/manim.py", // 设置运行程序
      "console": "integratedTerminal", // 使用vsc内置终端
      "args": [
        "${file}", // 当前文件路径
        "-r 2160,3840", // 4k设置
        "-p", //预览参数
        "--media_dir", // 输出路径参数
        "${workspaceFolder}/export" // 输出文件路径
      ]
    },
    {
      "name": "Export manim_old picture", // manim 老版本 导出最后一帧 4k
      "type": "python",
      "request": "launch",
      "cwd": "${workspaceFolder}/manim_old", // 设置当前工作路径
      "env": {
        "PYTHONPATH": "${workspaceFolder}/manim_old" // 设置Python运行环境变量
      },
      "program": "${workspaceFolder}/manim_old/manim.py", // 设置运行程序
      "console": "integratedTerminal", // 使用vsc内置终端
      "args": [
        "${file}", // 当前文件路径
        "-s", // 跳过动画
        "-r 2160,3840", // 4k设置
        "-p", // 预览参数
        "--media_dir", // 输出路径参数
        "${workspaceFolder}/export" // 输出文件路径
      ]
    }
  ]
}