news 2026/5/3 15:34:58

别再羡慕3Blue1Brown了!用Python的Manim库,从零开始制作你的第一个数学动画(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再羡慕3Blue1Brown了!用Python的Manim库,从零开始制作你的第一个数学动画(附完整代码)

从数学爱好者到动画创作者:用Manim开启你的可视化之旅

每次看到3Blue1Brown那些行云流水的数学动画,你是否也曾在心里暗想:"要是我也能做出这样的作品该多好"?好消息是,Grant Sanderson将他制作这些精美动画的工具——Manim库开源了。作为一个Python库,Manim让数学可视化不再是专业团队的专利,而是每个编程爱好者触手可及的能力。本文将带你从零开始,用代码重现那些让你惊叹的数学动画效果。

1. 为什么选择Manim?

在数据可视化领域,我们有Matplotlib、Seaborn等成熟工具,但它们主要针对静态图表。当需要展示数学概念的动态变化过程时,传统工具就显得力不从心。Manim正是为解决这一问题而生——它专为数学动画设计,能够精确控制每一个数学对象的运动轨迹、变形过程和视觉呈现。

与常见的动画工具相比,Manim有几个独特优势:

  • 数学精确性:所有图形都基于数学定义,圆就是完美的圆,抛物线就是精确的二次函数
  • 程序化控制:通过代码定义动画逻辑,便于复用和版本控制
  • LaTeX集成:完美支持数学公式渲染
  • 可扩展性:可以构建从简单图形到复杂系统的各种动画
# 一个简单的例子:展示Manim的精确性 from manim import * class PerfectCircle(Scene): def construct(self): # 创建一个完美的圆 circle = Circle(radius=2, color=BLUE) self.play(Create(circle)) self.wait()

提示:Manim特别适合教师制作教学材料、学生理解抽象概念,以及任何想要可视化数学之美的人。

2. 环境配置:避开新手的第一道坎

Manim的安装过程可能是新手遇到的第一个挑战。不同于大多数Python库的直接pip安装,Manim有更多的依赖项需要考虑。以下是经过验证的安装方案:

2.1 基础安装

推荐使用Python 3.8或更高版本,并创建虚拟环境:

python -m venv manim-env source manim-env/bin/activate # Linux/Mac manim-env\Scripts\activate # Windows pip install manim

2.2 常见问题解决

安装后运行时可能会遇到以下错误及解决方案:

错误类型可能原因解决方案
ModuleNotFoundError缺少依赖安装texlive-full(Mac/Linux)或MiKTeX(Windows)
渲染失败FFmpeg缺失安装FFmpeg并添加到系统PATH
LaTeX错误字体问题安装额外的LaTeX字体包
# 验证安装是否成功 from manim import __version__ print(f"Manim版本:{__version__}")

3. 你的第一个Manim动画:从"Hello World"开始

让我们从一个最简单的文本动画开始,了解Manim的基本工作流程。

3.1 基础代码结构

每个Manim动画都遵循类似的模式:

  1. 从manim导入所需类
  2. 创建继承自Scene的自定义类
  3. 在construct方法中定义动画序列
from manim import * class FirstAnimation(Scene): def construct(self): # 创建文本对象 greeting = Text("你好,数学世界!", font_size=48) # 动画序列 self.play(Write(greeting)) # 书写动画 self.wait(1) # 暂停1秒 self.play(FadeOut(greeting)) # 淡出动画

3.2 渲染与输出

保存为first.py后,在命令行运行:

manim -pql first.py FirstAnimation

参数说明:

  • -p:渲染后自动播放
  • -ql:低质量渲染(快速预览)
  • -qh:高质量渲染(最终输出)

4. 数学图形与动画:让公式动起来

Manim真正的威力在于对数学对象的精确控制和动画表现。让我们通过几个典型示例来探索。

4.1 基本几何图形

class GeometryShowcase(Scene): def construct(self): # 创建图形 circle = Circle(radius=1.5, color=BLUE) square = Square(side_length=2, color=GREEN) triangle = Polygon([-1,0,0], [1,0,0], [0,2,0], color=RED) # 排列图形 circle.shift(LEFT*3) triangle.shift(RIGHT*3) # 动画序列 self.play(LaggedStart( Create(circle), Create(square), Create(triangle), lag_ratio=0.5 )) self.wait()

4.2 函数图形绘制

class FunctionPlot(Scene): def construct(self): # 创建坐标系 axes = Axes( x_range=[-3, 3], y_range=[-1, 10], x_length=6, y_length=5 ) # 定义函数 def quadratic(x): return x**2 # 创建函数曲线 graph = axes.plot(quadratic, color=YELLOW) # 动画 self.play(Create(axes)) self.play(Create(graph)) self.wait()

4.3 数学公式动画

class FormulaAnimation(Scene): def construct(self): # 创建公式 formula = MathTex( r"e^{i\pi} + 1 = 0", font_size=96 ) # 分解公式 parts = formula.submobjects # 逐个显示公式部分 self.play(Write(parts[0][:2])) # e^ self.play(Write(parts[0][2:5])) # iπ self.play(Write(parts[0][5:])) # +1=0 self.wait()

5. 进阶技巧:打造专业级动画

当你掌握了基础后,可以尝试这些提升动画质量的技巧。

5.1 相机与视角控制

class CameraMovement(Scene): def construct(self): # 创建3D图形 cube = Cube(side_length=2, fill_opacity=0.7) sphere = Sphere(radius=1.2, fill_opacity=0.7).shift(OUT*3) # 设置相机 self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES) # 动画 self.play(Create(cube)) self.play(cube.animate.shift(IN*3)) self.play(Create(sphere)) self.begin_ambient_camera_rotation(rate=0.2) self.wait(4)

5.2 复杂动画组合

class ComplexAnimation(Scene): def construct(self): # 创建坐标系和函数 axes = Axes(x_range=[-3,3], y_range=[-1,10]) graph = axes.plot(lambda x: x**2, color=BLUE) # 创建移动的点 dot = Dot(color=RED).move_to(axes.c2p(0,0)) # 创建标签 label = always_redraw(lambda: Tex(f"({dot.get_center()[0]:.1f}, {dot.get_center()[1]:.1f})") .next_to(dot, UP) ) # 动画序列 self.play(Create(axes), Create(graph)) self.play(FadeIn(dot), Write(label)) self.play(dot.animate.move_to(axes.c2p(2,4)), run_time=3) self.play(dot.animate.move_to(axes.c2p(-1,1)), run_time=2) self.wait()

5.3 自定义动画效果

class CustomAnimation(Scene): def construct(self): text = Text("数学之美", font_size=72) # 自定义动画 def wave_effect(mob, dt): for i, letter in enumerate(mob): time = self.renderer.time letter.set_y( np.sin(time + i*0.5) * 0.2 + mob.get_center()[1] ) text.add_updater(wave_effect) self.add(text) self.wait(5)

6. 实战项目:构建完整的数学讲解动画

让我们把这些技巧综合起来,创建一个完整的数学概念讲解动画。

class DerivativeExplanation(Scene): def construct(self): # 设置坐标系 axes = Axes( x_range=[0, 5], y_range=[0, 25], x_length=6, y_length=4 ).shift(DOWN) # 定义函数和导数 def func(x): return 0.5 * x**2 def deriv(x): return x # 创建图形 graph = axes.plot(func, color=BLUE) tangent_line = always_redraw(lambda: axes.get_secant_slope_group( x=2, graph=graph, dx=0.01, secant_line_color=RED, secant_line_length=4 ) ) # 创建移动点 dot = Dot(color=YELLOW).move_to(axes.c2p(2, func(2))) # 创建标签 title = Tex("导数的几何意义", font_size=48).to_edge(UP) formula = MathTex(r"f(x) = \frac{1}{2}x^2").next_to(title, DOWN) derivative = MathTex(r"f'(x) = x").next_to(formula, DOWN) # 动画序列 self.play(Write(title)) self.play(Write(formula), Write(derivative)) self.play(Create(axes), Create(graph)) self.play(FadeIn(dot), Create(tangent_line)) # 移动点展示不同位置的切线 for x in [3, 1, 4, 2.5]: self.play( dot.animate.move_to(axes.c2p(x, func(x))), run_time=2 ) self.wait(0.5) self.wait(2)

7. 优化工作流程:提高创作效率

随着项目复杂度增加,这些技巧能帮助你更高效地工作。

7.1 模块化代码结构

# geometry.py from manim import * class BasicShapes(Scene): def construct(self): # 基础图形定义 pass # functions.py from manim import * class FunctionPlots(Scene): def construct(self): # 函数图形定义 pass # main.py from geometry import BasicShapes from functions import FunctionPlots # 组合多个场景

7.2 调试技巧

  • 使用-ql参数快速预览
  • 分段测试复杂动画
  • 利用self.debug方法检查对象属性
class DebugExample(Scene): def construct(self): circle = Circle() self.debug(circle) # 输出对象属性到控制台 self.play(Create(circle))

7.3 渲染优化

优化策略适用场景效果
降低分辨率开发阶段加快渲染速度
减少抗锯齿简单动画提升性能
分段渲染长动画降低内存使用
使用--disable_caching频繁修改避免缓存问题

8. 从模仿到创新:发展你的动画风格

当你熟悉了Manim的基本功能后,可以尝试这些方法发展独特的视觉风格。

8.1 自定义主题

class CustomTheme(Scene): def construct(self): # 设置自定义颜色主题 self.camera.background_color = "#1a1a1a" Text.set_default(color="#f0f0f0") Circle.set_default(color="#4cc9f0", fill_opacity=0.8) # 创建内容 title = Text("自定义主题", font_size=72) circle = Circle(radius=2) self.play(Write(title)) self.play(Create(circle)) self.wait()

8.2 混合动画技术

class MixedTechniques(Scene): def construct(self): # 创建3D对象 cube = Cube(fill_opacity=0.7) # 创建2D注释 annotation = Text("边长为1", font_size=24).next_to(cube, OUT) # 设置相机 self.set_camera_orientation(phi=60*DEGREES, theta=-45*DEGREES) # 动画序列 self.play(Create(cube)) self.play(Write(annotation)) self.begin_ambient_camera_rotation(rate=0.5) self.wait(3)

8.3 交互式开发

虽然Manim主要是编程生成动画,但可以通过以下方式增加交互性:

  • 使用Manim Community版本的--jupyter选项
  • 结合ipywidgets创建参数化动画
  • 输出为HTML5格式在网页中展示
# 在Jupyter notebook中使用 from manim import * %%manim -v WARNING -qh --jupyter InteractiveDemo class InteractiveDemo(Scene): def construct(self): slider = Slider(1, 5, 0.1, 3) def update_graph(mob): new_graph = axes.plot( lambda x: slider.value * x**2, color=BLUE ) mob.become(new_graph) axes = Axes(x_range=[-3,3]) graph = axes.plot(lambda x: 3*x**2) graph.add_updater(update_graph) self.add(axes, graph, slider) self.wait()

9. 分享你的作品:让世界看到你的创作

完成动画后,这些平台适合分享你的Manim作品:

  • 视频平台:YouTube、Bilibili等,添加适当的标签(#数学动画 #Manim)
  • 代码社区:GitHub、GitLab,包含完整的项目文件和说明
  • 教育平台:可汗学院、Coursera等在线学习网站
  • 技术博客:Medium、知乎专栏等,配合文字说明

提示:分享时考虑添加创作过程的说明,这不仅能帮助他人学习,也能获得更多反馈。

10. 持续学习资源

要进一步提升Manim技能,可以参考这些资源:

  • 官方文档:Manim Community版文档最全面
  • 开源项目:研究3Blue1Brown的开源动画代码
  • 社区论坛:Manim Discord频道活跃度高
  • 视频教程:YouTube上有许多进阶教程
# 最后一个小技巧:自动生成缩略图 class Thumbnail(Scene): def construct(self): title = Text("数学动画教程", font_size=72) formula = MathTex(r"e^{i\pi}+1=0", font_size=96) group = VGroup(title, formula).arrange(DOWN, buff=1) self.add(group) self.wait(0.1)

记住,每个优秀的Manim创作者都从第一个简单的动画开始。当你完成第一个作品时,就已经迈出了从数学爱好者到动画创作者的关键一步。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 15:34:02

3步学会在Windows上安装Android应用:APK Installer完整指南

3步学会在Windows上安装Android应用:APK Installer完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK Installer是一款专为Windows用户设计的Andr…

作者头像 李华
网站建设 2026/5/3 15:32:50

PPTist终极指南:如何在浏览器中免费制作专业级PPT演示文稿

PPTist终极指南:如何在浏览器中免费制作专业级PPT演示文稿 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowin…

作者头像 李华
网站建设 2026/5/3 15:32:49

为ClaudeCode编程助手配置Taotoken作为后端模型提供商

为ClaudeCode编程助手配置Taotoken作为后端模型提供商 1. 准备工作 在开始配置之前,请确保您已经拥有一个有效的Taotoken账户,并且已经在控制台创建了API Key。同时,您需要安装最新版本的ClaudeCode编程助手。这些是完成配置的基础条件。 …

作者头像 李华
网站建设 2026/5/3 15:30:51

Lobe Chat开源AI对话平台:私有化部署与架构解析

1. 项目概述:一个开源的现代化AI对话应用最近在折腾AI应用部署,发现了一个挺有意思的开源项目——Lobe Chat。这项目在GitHub上热度不低,仓库名是isaccanedo/lobe-chat,本质上是一个可以自己部署的、功能相当现代的AI聊天Web应用。…

作者头像 李华
网站建设 2026/5/3 15:30:49

告别隐式this!C++23的‘显式this’语法,让你的代码像Python一样清晰

告别隐式this!C23的‘显式this’语法,让你的代码像Python一样清晰 在Python的世界里,self参数就像一盏明灯,清晰地标识出当前实例对象。而C开发者却长期忍受着this指针的隐式存在——直到C23带来了革命性的Deducing This特性。这不…

作者头像 李华
网站建设 2026/5/3 15:29:59

OmniAgent全能智能体框架:从环境感知到任务执行的AI工程实践

1. 项目概述:一个面向未来的全能智能体框架最近在AI智能体领域,一个名为OmniAgent的项目引起了我的注意。它不是一个简单的聊天机器人,也不是一个单一功能的自动化脚本,而是一个旨在构建“全能型”智能体的开源框架。简单来说&…

作者头像 李华