利用Python中的Manim进行数学绘画和创作_Python

相信很多同学就算没听过3Blue1Brown,也一定曾看过他们出品的视频,其从独特的视觉角度解说各种数学概念,内容包括线性代数、微积分、神经网络、傅里叶变换以及四元数等晦涩难懂的知识点。例如最火的《线性代数本质》系列视频。

那么这些视频是如何制作的呢?

这里需要引入的是Python的Manim视频支持引擎——专门用于支持数学可视化的媒体引擎,通过Manim并结合Python编程就可以实现3Blue1Brown的视频效果。

利用Python中的Manim进行数学绘画和创作_Python_02

什么是Python

在当今备受推崇的大数据技术和人工智能技术领域,Python一直是一门备受瞩目的编程语言。它长期占据着TIOBE公布的编程语言排行榜的榜首位置。业界也一直流传着一句话:“人生苦短,我用Python”。Python作为一门计算机编程语言具有独特的优势,可以总结为以下三个特点:简洁性、易读性和可扩展性。

简洁性:

Python是一门非常简洁的脚本语言。很多时候,只需一行代码就能实现复杂的功能。比如,下面这行代码就能打印出一个九九乘法表。这种简洁性使得你能够将注意力集中在解决问题上,而不必花费过多时间去理解语言本身。

利用Python中的Manim进行数学绘画和创作_命令行_03

易读性: Python的语法风格清晰简约,易于阅读。有时候,它就像人类说话一样自然简单,没有过多的修饰。

可扩展性: Python最初的设计就注重可扩展性,它并没有将所有的特性和功能集成到核心语言中。Python提供了丰富的API和工具,以及众多第三方库,让你可以灵活扩展其功能。你可以根据需要选择合适的库来解决问题,这使得Python非常适合各种不同的应用场景。

什么是manim

[video(video-XSltZoq2-1701507173896)(type-csdn)(url-https://live.csdn.net/v/embed/348268)(image-https://video-community.csdnimg.cn/vod-84deb4/b5c3974090ec71eebffe4531959d0102/snapshots/c27edbef01424df2879bb7fdd67d0a3f-00001.jpg?auth_key=4855105689-0-0-0e92351ff29d33ff95daa30be6ad1ac3)(title-manim视频)]

manim是一个Python第三方库,全称是mathematical animation engine(数学动画引擎)。它是由斯坦福大学数学系学生Grant Sanderson在其YouTube频道3Blue1Brown上创建的。manim用于解说线性代数、微积分、神经网络、黎曼猜想、傅里叶变换以及四元数等数学概念。

manim因其精美的动画制作和独特的解释角度而广受关注,并吸引了越来越多的读者参与其中,共同贡献内容。manim经历了两个版本的迭代。第一代是ManimCairo,这是较早的版本,Grant Sanderson早期的项目都是在此版本中编译的。它使用cairo库作为渲染引擎。第二代是ManimGL,由Grant Sanderson等人开发的最新版本。该版本的最大改进是采用更强大的OpenGL库进行渲染。

此外,还有ManimCE(manim社区版),也使用OpenGL进行渲染。

manim使你能够以编程的方式创建精确的数学图形、动画和场景。与传统的几何画板等绘图软件不同,manim提供了一种全新的思路:“所思即可得”。它能够实现非常精准的绘制。在manim的世界中,你可以体验到一切皆可设置的感觉。颜色、粗细、长度、角度、时长、播放方式等均可通过设置来完成,这使你能够制作出具有个性化的数学动画。

版本

渲染引擎


ManimCairo

Cairo

manimlib

ManimGL

OpenGL

manimgl

ManimCE

OpenGL

manim

利用Python中的Manim进行数学绘画和创作_二次曲面_04

如何来运行Manim

  1. 安装 Manim: 首先,您需要安装 Python 和一些依赖项。然后,您可以通过以下命令使用 pip 安装 Manim:
pip install manim
  1. 创建动画: 创建一个 Python 脚本,并使用 Manim 中的类来定义您的动画场景和对象。
  2. 运行 Manim: 在命令行中,转到包含您的 Python 脚本的目录,并使用以下命令来运行 Manim:
manim your_script.py YourSceneName -p -ql

其中,your_script.py 是您的 Python 脚本的文件名,YourSceneName 是您定义的场景名称。

这样,Manim 就会开始渲染动画。请注意,Manim 的运行可能需要一定的时间,具体取决于动画内容和计算机性能。

用 Manim 绘制图形

首先需要引入 Manim 库,然后将需要绘制的内容封装到一个类(class)里面。

from manim import *

对于编辑好的程序文件(例如christmas-intro.py文件),需要在同一个文件夹下运行命令来运行程序,命令格式如下:

manim -pql christmas-intro.py DemoSquare

上面的命令行中:

  • manim 是运行程序的主要标志用语;
  • p 表示程序运行后会进行预览(图片或视频);
  • ql 表示低质量(quality low), 其他的选项有 -ql, -qm, -qh, -qk, 分别表示 低质量、正常质量、高质量、4K质量;
  • christmas-intro.py 是py代码文件;
  • DemoSquare 是 py代码文件中的一个类;

命令行中,还有其他许多参数可以设置,可以通过社区版的支持文档来进一步了解。

几个常见方程的示例

利用Python中的Manim进行数学绘画和创作_命令行_05

from manim import *

class QuadraticSurface(ThreeDScene):
    def construct(self):
        resolution_fa = 24 #曲面样本数
        axes = ThreeDAxes() #3维度笛卡尔直角坐标系
        self.set_camera_orientation(phi = 75*DEGREES, theta = 45*DEGREES) #phi是竖直方向岔开的角度,theta是水平面岔开的角度
    
        def paramsFunc(u, v): #参数方程
            
            x = u
            y = 1/2*u**2
            z = v
            return np.array([x, y, z])

        quadratic_surface = Surface(
            paramsFunc,
            resolution = (resolution_fa, resolution_fa), #分辨率
            u_range=[-2.5, +2.5], #参数u的范围
            v_range=[-1, +1], #参数v的范围
            fill_opacity = 0.5 #透明度

        ) #二次曲面

        self.add(axes) #添加坐标轴
        self.wait() #停留一秒
        self.play(Write(quadratic_surface), run_time = 10) #绘制二次曲面
        self.begin_3dillusion_camera_rotation(rate = 2) #摇晃rotation illusion
        self.wait(PI) #摇晃时长
        self.stop_3dillusion_camera_rotation() #停止摇晃

with tempconfig({'quality':'medium_quality', 'preview':True}):
    scene = QuadraticSurface()
    scene.render()

利用Python中的Manim进行数学绘画和创作_命令行_06

from manim import *

class QuadraticSurface(ThreeDScene):
    def construct(self):
        resolution_fa = 24 #曲面样本数
        axes = ThreeDAxes() #3维度笛卡尔直角坐标系
        self.set_camera_orientation(phi = 75*DEGREES, theta = 45*DEGREES) #phi是竖直方向岔开的角度,theta是水平面岔开的角度
    
        def paramsFunc(u, v): #参数方程
            
            x = np.sqrt(2)* np.cos(TAU*u)*v
            y = np.sqrt(2)* np.sin(TAU*u)*v
            z = v
            return np.array([x, y, z])

        quadratic_surface = Surface(
            paramsFunc,
            resolution = (resolution_fa, resolution_fa), #分辨率
            u_range=[-2, +2], #参数u的范围
            v_range=[-2, +2], #参数v的范围
            fill_opacity = 0.5 #透明度

        ) #二次曲面

        self.add(axes) #添加坐标轴
        self.wait() #停留一秒
        self.play(Write(quadratic_surface), run_time = 10) #绘制二次曲面
        self.begin_3dillusion_camera_rotation(rate = 2) #摇晃rotation illusion
        self.wait(PI) #摇晃时长
        self.stop_3dillusion_camera_rotation() #停止摇晃

with tempconfig({'quality':'medium_quality', 'preview':True}):
    scene = QuadraticSurface()
    scene.render()

manin安装教程

https://docs.manim.community/en/stable/installation.html(社区版)

利用Python中的Manim进行数学绘画和创作_Python_07

Manim教程合集

https://www.bilibili.com/video/BV1W4411Z7Zt/?vd_source=3ef6540f8473c7367625a53b7b77fd66Manim官方文档

https://docs.manim.org.cn/cairo-backend/getting_started/index.html

利用Python中的Manim进行数学绘画和创作_Python_08

利用Python中的Manim进行数学绘画和创作_命令行_09

from manim import *

class QuadraticSurface(ThreeDScene):
    def construct(self):
        resolution_fa = 24 #曲面样本数
        axes = ThreeDAxes() #3维度笛卡尔直角坐标系
        self.set_camera_orientation(phi = 75*DEGREES, theta = 45*DEGREES) #phi是竖直方向岔开的角度,theta是水平面岔开的角度
    
        def paramsFunc(u, v): #参数方程

            x =  np.sinh(u)*np.cos(v)
            y =  np.sinh(u)*np.sin(v)
            z =  np.cosh(u)
            return np.array([x, y, z])

        quadratic_surface = Surface(
            paramsFunc,
            resolution = (resolution_fa, resolution_fa), #分辨率
            u_range=[-1.5, +1.5], #参数u的范围
            v_range=[-PI, +PI], #参数v的范围
            fill_opacity = 0.5 #透明度

        ) #二次曲面


        def paramsFunc1(u, v): #参数方程

            x =  np.sinh(u)*np.cos(v)
            y =  np.sinh(u)*np.sin(v)
            z =  np.cosh(u)
            return np.array([x, y, -z])
        
        quadratic_surface1 = Surface(
                paramsFunc1,
                resolution = (resolution_fa, resolution_fa), #分辨率
                u_range=[-1.5, +1.5], #参数u的范围
                v_range=[-PI, +PI], #参数v的范围
                fill_opacity = 0.5 #透明度

            ) #二次曲面


        self.add(axes) #添加坐标轴
        self.wait() #停留一秒
        self.play(Write(quadratic_surface), run_time = 10) #绘制二次曲面
        self.play(Write(quadratic_surface1), run_time = 10) #绘制二次曲面
        self.begin_3dillusion_camera_rotation(rate = 2) #摇晃rotation illusion
        self.wait(PI) #摇晃时长
        self.stop_3dillusion_camera_rotation() #停止摇晃

with tempconfig({'quality':'medium_quality', 'preview':True}):
    scene = QuadraticSurface()
    scene.render()

版本说明

对于 Manim 的初学者,使用 Manim 时,对于其版本的选择还是有些需要注意的地方。

不同版本的代码、教程等,还是有稍许差异的。

目前 Manim 主要有三个版本:

利用Python中的Manim进行数学绘画和创作_Python_10

3b1b 旧版:3blue1brown 自己维护的版本,使用 Cairo 作为后端;

3b1b 新版:3blue1brown 自己维护的版本,使用 OpenGL 和 moderngl 来进行 GPU 渲染,优点是速度快;

Manim 社区版:社区版是2020年下半年才出来的版本,目前主要是 Manim 旧版的衍生,更新更活跃,有很好的文档和社区支持。当然,随着社区版的迭代更新,目前 3b1b 新版 的某些特性也在逐步容纳进来。

关于这几个版本如何选择的建议:

如果你是新接触这个工具的,建议可以从社区版开始,主要是社区版的文档教程比较齐全,其迭代的频率更快。 如果你是 Python 或者其他编程领域的资深人士,想体自己动手深入理解并优化这个工具,可以使用 3b1b 新版

Manim 的安装

在 Manim 3b1b 版本 和 社区版均提供了如何安装的文档:

3b1b 新版的安装文档:https://github.com/3b1b/manim 社区版的安装文档:https://docs.manim.community/en/stable/installation.html

安装ffmpeg

FFmpeg是一个开源的跨平台音视频处理工具,可以用来录制、转换和流式传输音视频内容。它包括一组库和程序,可以处理多种不同格式的音频、视频和图片文件。FFmpeg支持几乎所有主流的音视频格式,因此被广泛应用于多媒体处理领域。

FFmpeg提供了丰富的功能,包括但不限于:

  • 音视频编解码:可以对音频和视频进行编码(压缩)和解码(解压),支持众多编解码器。
  • 格式转换:可以将音视频文件从一个格式转换为另一个格式,例如从MP4转换为AVI。
  • 剪辑和编辑:可以对音视频文件进行剪辑、合并、分离等操作。
  • 流媒体处理:支持流式传输音视频内容,适用于网络直播、视频会议等场景。
  • 屏幕录制:可以用来录制屏幕内容并保存为视频文件。

由于其强大的功能和灵活性,FFmpeg被广泛用于视频处理、视频转码、音频处理等各种多媒体应用中。同时,FFmpeg也是许多视频播放器、编辑软件以及流媒体平台的重要组件之一。

安装FFmpeg可以通过命令行或者图形界面进行操作,以下是在Windows和MacOS上安装FFmpeg的基本步骤:

在Windows上安装FFmpeg

  1. 下载FFmpeg
  1. 解压文件
  • 将下载的压缩包解压到你想要安装的位置。
  1. 设置环境变量(可选):
  • 将FFmpeg的bin目录添加到系统的PATH环境变量中,这样就可以在命令行中直接访问FFmpeg。
  1. 测试安装
  • 打开命令提示符(Win + R,输入cmd,回车),输入以下命令来检查FFmpeg是否成功安装:
ffmpeg -version

在MacOS上安装FFmpeg

  1. 使用Homebrew安装(推荐):
  • 打开终端,运行以下命令安装Homebrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • 然后运行以下命令来安装FFmpeg:
brew install ffmpeg
  1. 测试安装
  • 在终端中输入以下命令来检查FFmpeg是否成功安装:
ffmpeg -version

在Linux上安装FFmpeg

  1. 使用包管理器安装
  • 对于大多数Linux发行版,可以使用其包管理器来安装FFmpeg。例如,在Ubuntu上可以使用以下命令:
sudo apt-get update
sudo apt-get install ffmpeg
  1. 测试安装
  • 在终端中输入以下命令来检查FFmpeg是否成功安装:
ffmpeg -version

验证安装

无论在哪个操作系统上安装,验证安装步骤都是一样的。只需要在命令行或终端中输入以下命令:

ffmpeg -version

如果安装成功,会显示FFmpeg的版本信息。这样就可以确认FFmpeg已经成功安装并且可以在系统中正常运行了。

利用Python中的Manim进行数学绘画和创作_Python_11

利用Python中的Manim进行数学绘画和创作_Python_12

利用Python中的Manim进行数学绘画和创作_命令行_13

安装Latex

LaTeX是一种专业的排版系统,常用于撰写学术论文、书籍、报告和演示文稿。与常见的文字处理软件(如Microsoft Word)不同,LaTeX使用的是一种“标记语言”,用户需要通过输入特定的命令和标记来控制文档的格式、结构和样式。

LaTeX最初是由著名计算机科学家Leslie Lamport开发的,它建立在TeX排版系统之上,并提供了一系列功能强大的工具和环境,使用户能够轻松地创建高质量的文档。

使用LaTeX编写文档的优势包括:

  • 专业的排版效果:LaTeX能够生成高质量、专业水准的文档排版,特别适合于学术论文、书籍等内容丰富的文档。
  • 具有强大的数学公式排版能力:LaTeX在排版数学公式和符号方面非常出色,被广泛应用于数学、物理等领域的文档撰写。
  • 跨平台性:LaTeX在不同操作系统上都可以运行,并且生成的文档格式稳定、可靠。

虽然学习曲线较陡,但一旦熟悉了LaTeX的基本语法和命令,就能够享受到其带来的排版便利和效果。

安装LaTeX可以通过以下步骤进行操作:

在Windows上安装LaTeX

利用Python中的Manim进行数学绘画和创作_Python_14

  1. 下载安装包
  1. 运行安装程序
  • 双击下载的安装程序,按照提示进行安装。
  1. 配置编辑器(可选):
  • 如果你希望使用图形化的编辑器来编写LaTeX文档,可以安装一些流行的LaTeX编辑器,如TeXstudio、TeXworks等,这些编辑器通常会自动检测已安装的LaTeX发行版。
  1. 测试安装
  • 打开命令提示符或者你喜欢的LaTeX编辑器,新建一个简单的.tex文件,输入以下内容并保存:
\documentclass{article}
\begin{document}
Hello, LaTeX!
\end{document}
  • 编译这个文件,如果能够生成对应的.pdf文件并且内容显示正常,那么LaTeX安装成功了。

在MacOS上安装LaTeX

  1. 使用MacTeX安装
  • 下载并安装MacTeX,这是专为MacOS准备的LaTeX发行版。你可以在MacTeX官方网站下载最新版本的安装程序。
  1. 配置编辑器(可选):
  • 安装一些流行的LaTeX编辑器,如TeXShop、TeXstudio等,这些编辑器通常会自动检测已安装的LaTeX发行版。
  1. 测试安装
  • 使用编辑器创建一个简单的.tex文件,输入上述示例中的内容,并进行编译。

在Linux上安装LaTeX

  1. 使用包管理器安装
  • 对于大多数Linux发行版,可以使用其包管理器来安装LaTeX。例如,在Ubuntu上可以使用以下命令:
sudo apt-get update
sudo apt-get install texlive-full
  1. 测试安装
  • 使用编辑器创建一个简单的.tex文件,输入上述示例中的内容,并进行编译。

安装dvisvgm

安装 dvisvgm 可以通过以下步骤进行:

Windows 用户

  1. 使用 Chocolatey 进行安装: 打开命令提示符(CMD)或 PowerShell,并执行以下命令:
choco install dvisvgm

macOS 用户

  1. 使用 Homebrew 进行安装: 打开终端,并执行以下命令:
brew install dvisvgm

Linux 用户

  1. 对于基于 Debian 的系统(如 Ubuntu): 打开终端,并执行以下命令:
sudo apt-get install dvisvgm
  1. 对于基于 Red Hat 的系统(如 Fedora): 打开终端,并执行以下命令:
sudo dnf install dvisvgm

一旦安装完成,您可以在命令行中运行 dvisvgm --version 来验证 dvisvgm 是否成功安装。

利用Python中的Manim进行数学绘画和创作_二次曲面_15

参考文献

1.https://www.tiobe.com/tiobe-index 2.https://baike.baidu.com/item/Python/407313?fr=aladdin 3.https://docs.manim.community/en/stable/installation.html 4.https://docs.manim.org.cn/