Manim 开发环境搭建
本文将详细说明如何搭建 Manim 的开发环境以及如何编写一个简洁、生动、形象的数学动画,演示公式
[ (a+b)^2 = a^2 + 2ab + b^2 ] 的证明过程。
第一部分 开发环境搭建
为了顺利运行 Manim 并生成动画,需要配置以下几项环境组件:安装 LaTeX 发行版与 FFmpeg。下面根据不同操作系统介绍具体步骤。
Windows 环境
1. 安装 LaTeX 发行版
- 推荐使用 MiKTeX
2. 安装 FFmpeg
下载 ffmpeg-git-full.7z 版本
解压后,将 bin 文件夹添加至系统 PATH
或者使用 Chocolatey 安装:
choco install ffmpeg
Linux 环境 (Ubuntu/Debian)
1. 安装 LaTeX 发行版
通过包管理器安装 TeX Live 全部组件:
sudo apt-get install texlive-full
2. 安装 FFmpeg
使用包管理器安装:
sudo apt-get install ffmpeg -y
3. 安装 C 开发环境
sudo apt install -y build-essential pkg-config
sudo apt install -y cmake
sudo apt install -y libcairo2-dev libpango1.0-dev
macOS 环境
1. 安装 LaTeX 发行版
- 推荐使用 MacTeX
2. 安装 FFmpeg
使用 Homebrew 安装:
brew install ffmpeg
3. 创建 Python 环境
建议使用 Conda 创建一个独立的 Python 环境以避免依赖冲突。以 Python 3.11 为例:
conda create --name manim python=3.11 -y
conda activate manim
4. 安装 Manim 社区版及其依赖
安装 Manim 以及一些必要的依赖库。你可以通过 pip 自动安装所需依赖(如 numpy、Pillow、opencv-python 等)。例如:
pip install manim
# Text and LaTeX rendering
pip install manimpango
pip install latex
# 音频相关
pip install moviepy
# 请求相关
pip install requests
此外,还需要确保系统上安装了 LaTeX 发行版和 FFmpeg,以便正确渲染文本和生成视频文件。
安装字体
适用于 Linux(如 Ubuntu、CentOS、Amazon Linux)
安装 CJK 字体:
确保已安装包含中文字符的字体。推荐使用 Noto CJK。
Debian/Ubuntu:
sudo apt update sudo apt install fonts-noto-cjk
RHEL/CentOS/Amazon Linux:
sudo yum install google-noto-cjk-fonts # 或者更具体地安装中文支持(如果可用): # sudo yum groupinstall -y "Chinese Support"
其他常见的字体包还包括
wqy-zenhei
或fonts-arphic-uming
。
更新字体缓存:
安装新字体后,需要刷新系统字体缓存,让应用(包括 LaTeX)能够找到它们。
sudo fc-cache -fv
确保完整的 LaTeX 发行版:
精简的 LaTeX 安装可能缺少 CJK 支持或
fontspec
等重要包。Debian/Ubuntu(TeX Live):
sudo apt install texlive-full # 体积很大,但功能全面 # 或者更有针对性地安装: # sudo apt install texlive-xetex texlive-lang-chinese texlive-latex-extra
RHEL/CentOS/Amazon Linux(TeX Live):
sudo yum install texlive-scheme-full # 体积很大 # 或者根据可用情况有选择地安装相应包
如果你是手动安装 TeX Live 或使用
tlmgr
管理,请确保安装ctex
、fontspec
和xecjk
(或对 LuaLaTeX 使用luatexja
):sudo tlmgr update --self sudo tlmgr install ctex fontspec xecjk # 或 luatexja
Manim 配置:
- 确保在你的 Manim 脚本中设置
config.tex_template = TexTemplateLibrary.ctex
,这样 Manim 会配合ctex
包使用xelatex
或lualatex
。
- 确保在你的 Manim 脚本中设置
macOS
CJK 字体:
- macOS 通常自带优质的 CJK 字体(例如 PingFang SC、Hiragino Sans CNS)。除非被手动删除,一般不会缺少相关字体。
- 如仍需安装,可通过“字体册”(Font Book)安装,或将
.ttf
/.otf
文件放到~/Library/Fonts
(仅当前用户)或/Library/Fonts
(系统范围)目录。
字体缓存:
macOS 通常会自动管理字体缓存。若遇到顽固问题,可尝试重置字体缓存(通常需要重启):
sudo atsutil databases -remove # 然后重启 Mac
LaTeX 发行版(MacTeX):
macOS 的标准 LaTeX 发行版是 MacTeX。完整安装的 MacTeX 通常包含 CJK 支持所需的全部组件。
请确保您的 MacTeX 为最新版本。
使用 MacTeX 自带的 TeX Live Utility,或在终端使用
tlmgr
,确认安装了ctex
、fontspec
和xecjk
(或luatexja
):sudo tlmgr update --self sudo tlmgr install ctex fontspec xecjk
Manim 配置:
- 与 Linux 相同,请确保在 Manim 脚本中设置
config.tex_template = TexTemplateLibrary.ctex
。
- 与 Linux 相同,请确保在 Manim 脚本中设置
通用故障排除(两种系统通用)
检查 LaTeX 日志文件:
- 当出现 LaTeX 错误时,Manim 会输出
.log
日志文件的路径(如cache/.../Tex/...log
)。该文件包含xelatex
/lualatex
的详细报错信息,常能指出缺失的字体或fontspec
相关问题。
- 当出现 LaTeX 错误时,Manim 会输出
测试最小 LaTeX 示例:
- 在 Manim 之外创建一个最小的
.tex
文件,使用ctex
和中文字符,并直接用xelatex yourfile.tex
编译。这样可将问题隔离到 LaTeX 配置层面。
示例
test.tex
:\documentclass{article} \usepackage{ctex} % 或 \usepackage[UTF8]{ctex} \begin{document} 三角函数 \end{document}
使用命令编译:
xelatex test.tex
- 在 Manim 之外创建一个最小的
第二部分 入门示例:证明 ((a+b)^2 = a^2 + 2ab + b^2)
示例说明
本示例旨在用 Manim 展示一个几何证明思路:
- 绘制一个边长为 (a+b) 的大正方形。
- 在正方形内部画出分割线,将正方形划分为四个部分:
- 左上角为边长为 (a) 的小正方形(面积 (a^2));
- 右下角为边长为 (b) 的小正方形(面积 (b^2));
- 剩余的两个矩形面积分别为 (ab),共计 (2ab);
- 最后,在动画中添加数学公式 ((a+b)^2 = a^2 + 2ab + b^2) 以验证证明过程。
示例代码
下面是一个名为 binomial_square.py
的示例代码,该代码使用 Manim 来演示上述证明过程。你可以根据需要保存该文件并使用 Manim 运行它。
from manim import *
class BinomialSquare(Scene):
def construct(self):
# Define constants
a = 2
b = 1
square_side = a + b
# Create the main square
main_square = Square(side_length=square_side).set_color(BLUE)
# Add labels (a+b) on sides
label_a_top = Text("a", font_size=24).next_to(main_square, UP).shift(LEFT * b / 2)
label_b_top = Text("b", font_size=24).next_to(main_square, UP).shift(RIGHT * a / 2)
label_a_left = Text("a", font_size=24).next_to(main_square, LEFT).shift(UP * b / 2)
label_b_left = Text("b", font_size=24).next_to(main_square, LEFT).shift(DOWN * a / 2)
# Create dividing lines
v_line = Line(main_square.get_corner(UP) + DOWN * a,
main_square.get_corner(DOWN) + UP * b)
h_line = Line(main_square.get_corner(LEFT) + RIGHT * a,
main_square.get_corner(RIGHT) + LEFT * b)
# Create smaller squares and rectangles
a_square = Square(side_length=a).set_color(RED).move_to(main_square.get_corner(UP + LEFT))
b_square = Square(side_length=b).set_color(YELLOW).move_to(main_square.get_corner(DOWN + RIGHT))
ab_rect1 = Rectangle(width=a, height=b).set_color(GREEN).next_to(a_square, RIGHT)
ab_rect2 = Rectangle(width=b, height=a).set_color(GREEN).next_to(a_square, DOWN)
# Animation sequence
self.play(Create(main_square))
self.play(Write(label_a_top), Write(label_b_top),
Write(label_a_left), Write(label_b_left))
self.play(Create(v_line), Create(h_line))
self.play(FadeIn(a_square), FadeIn(b_square),
FadeIn(ab_rect1), FadeIn(ab_rect2))
# Formula text
formula = MathTex(r"(a+b)^2 = a^2 + 2ab + b^2").to_edge(DOWN)
self.play(Write(formula))
self.wait(2)
if __name__ == "__main__":
# Basic configuration
config.pixel_height = 1080 # Set resolution height
config.pixel_width = 1920 # Set resolution width
config.frame_rate = 30 # Set frame rate
config.output_file = "CombinedScene" # Specify output filename
config.disable_caching = True # Disable caching
# Set output directory using placeholder for Java replacement
config.media_dir = "#(output_path)" # IMPORTANT: Use the placeholder
# Create and render the scene
sence = BinomialSquare()
sence.render()
print(f"Scene rendering finished. Output in: {config.media_dir}")
代码说明
大正方形的绘制:
使用Square
类创建一个边长为 (a+b) 的正方形,并将其上移以便下方留出位置显示公式。分割线:
通过Line
类分别绘制一条垂直分割线和一条水平分割线,将正方形划分为四个部分。各区域的构造与标注:
- 左上角的正方形代表面积 (a^2);
- 右下角的正方形代表面积 (b^2);
- 剩下两个矩形分别代表面积 (ab),共计 (2ab);
使用MathTex
对象在各个区域中添加文本标注。
公式展示:
最后在动画底部显示公式 ((a+b)^2 = a^2 + 2ab + b^2),帮助观众直观理解各部分面积之和即为整个正方形的面积。
在 windows 平台,生成的文件 路径是 media\videos\1080p60\BinomialSquare.mp4
总结
本文详细介绍了如何搭建 Manim 开发环境,包括安装 LaTeX、FFmpeg、创建 Python 环境以及安装 Manim 及其依赖。随后,通过一个入门示例展示了如何用 Manim 编写动画来证明公式 ((a+b)^2 = a^2 + 2ab + b^2) 的几何证明过程。希望这篇文档能帮助你快速上手 Manim,创作出更多生动有趣的数学动画。