mcpField
M
manim

manim

github.com/iart-ai创意与媒体15716 次安装18 周前更新
代码仓库

关于 manim

manim 是使用 Python 制作数学、物理和计算机科学动画的技能,适用于教育视频创作者。它可排版公式、绘制动态图表和几何场景,并渲染为确定性的 MP4 或 GIF。

主要功能

  1. 01用矢量对象构建场景
  2. 02动画呈现和变换公式
  3. 03绘制函数并实时更新数值
  4. 04制作 3D 场景与镜头运动
  5. 05渲染 MP4、GIF 或静帧

适用场景

  1. 01展示公式推导过程
  2. 02演示点沿图像移动
  3. 03讲解几何或 3D 概念

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/iart-ai/manim-skills --skill manim

安装后在 Claude Code 中输入/manim确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
references/
3d-and-camera.md
graphs-and-updaters.md
math-and-text.md

详细介绍

Manim(程序化数学动画)

Manim(数学动画引擎,社区版)通过 Python 渲染数学、物理和计算机科学讲解视频,是 3Blue1Brown 风格动画背后的引擎。每个场景都以声明式方式构建:创建矢量对象,在对象上播放定时动画,然后通过 CLI 渲染出确定性的 MP4/GIF。它尤其擅长动态公式、公式变形、动态图表和几何直觉演示。

适用场景

  • 为公式制作动画:将公式写出,逐项变换,并突出显示代换内容。
  • 可视化函数或图表:坐标轴、绘制的曲线、沿曲线移动的点,以及曲线下方的面积。
  • 几何或概念讲解:逐步展开的证明、向量、变换、数轴。
  • 3D 数学:曲面、参数曲线、围绕形状旋转的摄像机。
  • 任何“展示数学动态变化”的教育短片,渲染为 MP4/GIF。

它不适用于 UI 动效、社交媒体/营销视频或基于 CSV 数据的商业图表——这些场景请使用 Web 动画或 Remotion 视频技能。Manim 的优势在于数学排版和直觉演示。

安装与渲染

pip install manim          # needs Python 3.9+, ffmpeg, and a LaTeX distribution (for Tex/MathTex)
manim -pql scene.py SquareToCircle   # render one Scene class, preview at low quality

渲染标志(重要选项):

  • -q l|m|h|k — 质量:从低(快速迭代)到 4K。构建时使用 -ql,发布时使用 -qh。
  • -p — 完成后播放;-o name — 输出文件名;--format=gif — 渲染 GIF(README 演示)。
  • -s — 将最后一帧保存为 PNG(不编码视频——这是验证手段,见下文)。
  • -n a,b — 仅渲染动画索引范围 a..b(提前停止,以检查某个时刻)。
  • 输出文件位于 media/videos/<file>/<quality>/<Scene>.mp4(使用 -s 时,图像位于 media/images/...)。

三个构建模块

所有内容都由 Scene(编排)通过 Animation(定时变化)作用于 Mobject(对象)构成。

from manim import *

class SquareToCircle(Scene):
    def construct(self):                 # ALL animation code lives in construct()
        sq = Square().set_fill(BLUE, opacity=0.5)
        self.play(Create(sq))            # animate it drawing on
        self.play(sq.animate.rotate(PI / 4))
        self.play(Transform(sq, Circle().set_fill(PINK, opacity=0.5)))
        self.wait(0.5)                   # hold

Mobject — 矢量对象(Circle、Square、Rectangle、Line、Dot、Polygon、Axes、Text、MathTex)。

  • 位置:.shift(UP*2)(相对位置)、.move_to(ORIGIN)(绝对位置)、.next_to(other, RIGHT, buff=0.5)、.align_to(other, LEFT)。方向为常量:UP DOWN LEFT RIGHT ORIGIN UL UR DL DR。
  • 样式:.set_fill(color, opacity)、.set_stroke(color, width)、.set_color(YELLOW)。颜色:BLUE RED GREEN YELLOW WHITE,以及 BLUE_E 等。
  • self.add(m) 会立即显示(不播放动画);self.remove(m) 会移除对象。后添加的对象会显示在上层。

Animation — 在 run_time 秒内对 Mobject 的状态进行插值(默认 1 秒)。

  • 构建:Create、Write(用于文本/Tex)、DrawBorderThenFill、FadeIn、FadeOut、GrowFromCenter。
  • 变换:Transform(a, b)(将 a 变形成 b,并保留 a)、ReplacementTransform(a, b)(用 b 替换 a)、Rotate、Indicate、Circumscribe、Wiggle。
  • .animate 语法 — 为任意方法调用添加动画:self.play(sq.animate.shift(UP).set_fill(RED))。链式调用会同时应用。
  • 同时播放多个动画:self.play(Create(a), FadeIn(b), run_time=2)。

时序与缓动 — run_time= 设置时长;rate_func= 设置缓动曲线(默认是 smooth,即缓入缓出;还包括 linear、rush_into、rush_from、there_and_back、ease_out_bounce)。使用 LaggedStart(*anims, lag_ratio=0.2) 错开一组动画。motion-design-skills 技能包中的动画制作原则(animation-principles:眼睛对缓慢的结束比对缓慢的开始更不宽容;仅将 linear 用于循环;错开动画组)同样适用——在 Manim 中,只需通过 rate_func + LaggedStart 表达这些原则。

数学、文本与公式

标签使用 Text/MarkupText(Pango,不使用 LaTeX);排版数学内容使用 Tex/MathTex(LaTeX,原始字符串)。使用 Write 为公式制作动画,并使用 TransformMatchingTex 在公式之间变形。完整用法示例——子串着色、{{ }} 隔离、逐项变换、LaTeX 前导区——见 references/math-and-text.md。

图表、绘图与更新器

函数可使用 Axes + ax.plot(lambda x: ...);ax.c2p(x, y) 可将数学坐标映射到屏幕坐标。使用 ValueTracker + always_redraw/add_updater 驱动实时数值,让依赖的 mobject 每帧重新计算(例如沿曲线移动的点、计数器、移动的切线)。请参阅 references/graphs-and-updaters.md。

3D 与移动摄像机

使用 ThreeDScene + set_camera_orientation(phi=, theta=)、ThreeDAxes、Surface、begin_ambient_camera_rotation();使用 MovingCameraScene + self.camera.frame.animate... 实现 2D 摄像机的推进和跟随。请参阅 references/3d-and-camera.md。

交付与验证(渲染帧 → MP4)

内置辅助脚本(scripts/):使用 scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png 拼接静帧,再使用 scripts/probe-mp4.sh out.mp4 [WxH] [fps] 验证编码。请参阅 scripts/README.md。

Manim 是确定性的——相同场景会渲染出相同帧——因此在提交完整视频前,请先渲染帧(PNG,不进行视频编码)进行验证。只要输出是数学短片 MP4/GIF,就请采用此方法。

输出要求:

  • 每个短片对应一个 .py 文件,其中包含一个 Scene(或 ThreeDScene)子类;所有动作都写在 construct() 中。交付内容 = 渲染后的 media/videos/.../<Scene>.mp4 和脚本(以便重新渲染)。
  • 所有 Tex/MathTex 都使用原始字符串(r"...");需安装 LaTeX。

验证流程——渲染帧 → 检查 → 编码视频:

# 1. Save the final frame as a PNG, low quality — fast, no encode
manim -sql scene.py MyScene
# 2. Inspect a MID moment: stop after animation N and save that frame
manim -sql scene.py MyScene -n 0,3        # frame after the first 3 animations
# 3. Check each PNG: fidelity (equation correct, axes/labels right, nothing
#    overlapping or off the 16:9 frame) + LaTeX actually compiled (no blank/box glyphs).
# 4. Only once frames look right, encode the video:
manim -qh scene.py MyScene                # full MP4 at high quality
manim -qm scene.py MyScene --format=gif   # GIF for a README demo

完成前请确认:

  1. manim -sql ... -n a,b 能在开头 / 中间范围 / 结尾干净地完成渲染——没有 LaTeX 错误,也没有缺失字形方框。
  2. 方程和标签在数学上正确,且完全位于画面内(边缘没有裁切)。
  3. 检查的帧中,mobject 之间没有重叠;使用 next_to/arrange,而不是凭感觉猜坐标。
  4. 节奏自然——有意设置 run_time/rate_func,使用 self.wait() 停留在关键状态,并让组内元素错开出现,而非同时出现。
  5. 完整 MP4 编码并能播放;(可选)为 README 渲染 GIF。

快速参考

需求使用方式
新建动画class S(Scene): def construct(self): ...
立即显示 / 动画显示self.add(m) / self.play(Create(m))
为方法添加动画self.play(m.animate.shift(UP))
变形 / 替换Transform(a,b) / ReplacementTransform(a,b)
排版数学公式MathTex(r"e^{i\pi}+1=0"),使用 Write 添加动画
变形方程TransformMatchingTex(eq1, eq2)
绘制函数图像ax=Axes(...); ax.plot(lambda x: x**2)
实时 / 关联数值ValueTracker + always_redraw(...)
设置相对位置m.next_to(other, RIGHT, buff=0.3)
时长 / 缓动self.play(a, run_time=2, rate_func=smooth)
让组内元素错开出现LaggedStart(*anims, lag_ratio=0.2)
渲染 / 检查 / GIFmanim -qh f.py S / -sql -n a,b / --format=gif

注意事项

  • Tex/MathTex 需要 LaTeX(Text 不需要)。出现缺失字形方框或编译错误,说明未安装 LaTeX 或 TeX 字符串有误。始终使用原始字符串 r"..."。
  • Transform(a, b) 会修改 a,使其外观变为 b(且不会添加 b);ReplacementTransform(a, b) 会让 b 留在屏幕上——请根据之后需要继续引用哪个对象来选择。
  • .animate 会在起始状态和结束状态之间插值,因此旋转 / 某些变换可能会走奇怪的路径;路径很重要时,请使用专用动画(Rotate)。
  • 使用 add_updater 添加的更新器会持续运行——完成后请调用 mob.clear_updaters()(或 remove_updater),否则后续动画会与更新器冲突。
  • 不要凭感觉猜坐标;使用 next_to、arrange、VGroup(...).arrange(DOWN) 和 ax.c2p() 进行组合,确保布局在修改后仍然合适。
  • construct() 只运行一次,用于编排时间线;它不是实时循环——切勿使用墙上时钟时间或未设置种子的随机数。

参考文件

  • references/math-and-text.md — Text、MarkupText、Tex 和 MathTex 的区别、原始字符串、子字符串着色(set_color_by_tex、substrings_to_isolate、{{ }})、TransformMatchingTex 项变换,以及 LaTeX 前导区和软件包。
  • references/graphs-and-updaters.md — Axes/NumberPlane、plot、get_area、c2p/p2c、ValueTracker、always_redraw、add_updater、沿曲线描点,以及动画计数器。
  • references/3d-and-camera.md — ThreeDScene、set_camera_orientation、ThreeDAxes、Surface/参数曲面、环境摄像机旋转,以及 MovingCameraScene 的推近和跟随。

评论

支持 Markdown