Manim + ChatGPT 实践:零基础也能制作酷炫动画
引言
我从博主@baibanbaonet处了解到Manim,进而了解到知名的3Blue1Brown频道使用的就是Manim这个动画软件。这个软件是由Grant Sanderson自己专门开发用于创建数学动画的。
https://github.com/3b1b/manim
Manim介绍
Manim是一个开源的Python库,用于制作数学动画。它可以帮助你创建高质量的动画,展示数学概念、方程和几何图形等。
Manim是个让我非常兴奋的工具,初次结识,就着迷使用了很久。
以下视频都是我用Manim做的。
视频1
视频2
视频3
视频4
视频5
Manim可制作的类型
Manim (Mathematical Animation Engine) 除了可以做数学公式相关的动画之外,还可以用来制作各种类型的动画。以下是一些例子:
几何图形动画:可以绘制和动画化各种几何图形,如多边形、圆形、椭圆、立方体等。 数据可视化:可以用来创建数据可视化动画,如条形图、饼图、折线图等。 物理模拟:可以用来模拟物理现象,如抛物运动、波动现象、电磁场等。 算法演示:可以用来演示各种算法的运行过程,如排序算法、搜索算法、图论算法等。 文本动画:可以创建文本动画,如标题动画、字幕动画、渐显渐隐效果等。 三维动画:可以创建和动画化三维对象和场景,进行三维视角的变换和旋转。 自定义动画:可以通过编写自定义的动画类和方法,制作各种特效和动画场景。
Manim 安装指南
为什么有不同版本的 Manim?
Manim 最初由 Grant Sanderson 创建,用于他的 YouTube 频道 3Blue1Brown。随着频道的受欢迎程度增加,许多人想使用 Manim 来制作自己的项目。然而,最初的 Manim 仅供个人使用,其他用户很难安装和使用。
版本历史
2019 年底: Grant 开始在一个新分支(Shaders 分支)上工作,以实现更快的 OpenGL 渲染。 2020 年中: 一组开发者将其分叉成现在的社区版(ManimCE)。 2021 年初: Grant 将 Shaders 分支合并回主分支,形成了 ManimGL。
各版本介绍
Manim (ManimCE): 由社区维护的版本,是文档所在的版本,PyPI 包名为 manim
。ManimGL: 由 Grant Sanderson 维护的最新版本,具有更多实验性功能,PyPI 包名为 manimgl
。ManimCairo: OpenGL 渲染前的旧版本,仅用于渲染 Grant 的旧视频,PyPI 包名为 manimlib
。
应该使用哪个版本?
推荐: 对初学者推荐使用社区版(ManimCE),更稳定,文档完善,社区响应快速。
https://docs.manim.community/en/stable/installation/macos.html
Manim社区文档里安装指南很详细,这里只展示Mac电脑安装。
macOS安装Manim指南
前提条件
假设你已经安装了流行的软件包管理器 Homebrew。如果尚未安装,请按照Homebrew的安装指南进行操作。
必需依赖项
安装所有必需依赖项
运行以下命令安装 Manim 所需的所有依赖项(即:ffmpeg、Python 以及一些必要的 Python 包):
brew install py3cairo ffmpeg
Apple Silicon 处理器额外依赖
对于基于 Apple Silicon 的设备(例如,带有 M1 芯片的设备),需要额外安装以下依赖项:
brew install pango pkg-config scipy
安装 Manim
在所有必需依赖项安装完成后,运行以下命令安装 Manim:
pip3 install manim
可选依赖项
若要使用 Manim 的 LaTeX 接口(例如渲染方程),需要安装 LaTeX。官方说明这是一个可选依赖项,如果你不打算使用 LaTeX,则不必安装。
为了充分探索Manim的魅力,我建议安装LaTeX。
安装 LaTeX
对于 macOS,推荐的 LaTeX 发行版是 MacTeX。你可以按照链接中的说明进行安装,也可以通过 Homebrew 安装:
brew install --cask mactex-no-gui
📢注意:
MacTeX 是一个完整的 LaTeX 发行版,需要超过 4GB 的磁盘空间。如果这是个问题,考虑安装较小的发行版如 BasicTeX。
我的笔记本在尝试安装完整的LaTeX发行版时未成功,于是我改为安装了BasicTeX这个较小的发行版。
在安装过程中,你可能会遇到一些问题,不要着急,直接把报错发给GPT或Claude,一步步解决就好。
安装好后,你就可以试下以下代码,运行你的第一个Manim动画了。
一个圆圈的动画
打开一个文本编辑器,例如记事本。
from manim import *
class CreateCircle(Scene):
def construct(self):
circle = Circle() # 创建一个圆圈
circle.set_fill(PINK, opacity=0.5) # 设置颜色和透明度
self.play(Create(circle)) # 在屏幕上显示圆圈
将代码片段保存到你的项目文件夹中,命名为 scene.py
。
project/
└─scene.py
打开命令行,导航到你的项目文件夹,并执行以下命令:
manim -pql scene.py CreateCircle
生成效果如下:
分享我使用Manim的体验
视频1
这里是一个使用 Manim 创建文本动画的示例,用于展示 AI 发展的历史。
首先,创建一个名为 ai_history.py
的文件,并将以下代码粘贴到文件中:
from manim import *
class AIHistory(Scene):
def construct(self):
# Define the history events
history = [
"1956: The term 'Artificial Intelligence' is coined at the Dartmouth Conference.",
"1966: ELIZA, an early natural language processing computer program, is created.",
"1980: The first AI winter begins, a period of reduced funding and interest in AI research.",
"1997: IBM's Deep Blue defeats world chess champion Garry Kasparov.",
"2011: IBM's Watson wins Jeopardy! against human champions.",
"2016: Google's AlphaGo defeats world champion Go player Lee Sedol.",
"2020: OpenAI's GPT-3, a powerful language model, is released."
]
# Create a title
title = Text("AI Development History").scale(1.2)
self.play(FadeIn(title))
self.wait(1)
self.play(title.animate.to_edge(UP))
# Animate each history event
for event in history:
event_text = Text(event, font_size=24)
self.play(FadeIn(event_text))
self.wait(2)
self.play(FadeOut(event_text))
# End with a thank you message
thank_you = Text("Thank you for watching!").scale(1.2)
self.play(FadeIn(thank_you))
self.wait(2)
if __name__ == "__main__":
from manim import *
scene = AIHistory()
scene.render()
保存文件后,可以使用以下命令在终端中运行该文件,生成动画:
manim -pql ai_history.py AIHistory
这段代码实现了以下功能:
定义了一些 AI 发展历史上的关键事件。 创建了一个标题 "AI Development History",并将其显示在屏幕顶部。 逐条显示历史事件,每条事件显示 2 秒后淡出。 结束时显示感谢信息 "Thank you for watching!"。
每个历史事件都是通过 FadeIn
和 FadeOut
动画效果来显示和消失的。这种方式可以让观众逐步看到每个事件,从而更好地了解 AI 的发展历史。
视频2
神经网络图,我是参考推文的图片让GPT生成的Manim代码。
视频3
这是我让GPT帮我写的,给它的参考图片是我用html排版的,我将其中的美人鱼换成了表情包SVG。
在GPT生成代码后和它继续交流改进。
项目代码:
from manim import *
import random
class EmojiPattern(Scene):
def construct(self):
# 设置背景颜色
self.camera.background_color = "#faf7f0"
# 加载SVG文件
svg_path = "emoji-wink-svgrepo-com.svg"
emoji = SVGMobject(svg_path).scale(0.5)
# 定义颜色列表
colors = [RED, ORANGE, YELLOW, GREEN, TEAL, BLUE, PURPLE]
# 创建5x5的emoji网格,并赋予随机颜色和移动
rows = 5
cols = 5
x_spacing = 1.5
y_spacing = 1.5
emojis = []
for i in range(rows):
for j in range(cols):
emoji_copy = emoji.copy()
emoji_copy.set_color(random.choice(colors))
emoji_copy.move_to((j * x_spacing - 3, i * y_spacing - 3, 0))
emojis.append(emoji_copy)
self.add(emoji_copy)
# 添加底部文本
text = Text("Dragon Boat Festival", font_size=24).to_edge(DOWN)
self.add(text)
# 让emoji随机移动并变化颜色,持续30秒
for _ in range(30):
self.play(
*[ApplyMethod(emoji.shift, np.random.uniform(-0.5, 0.5, 3)) for emoji in emojis],
*[ApplyMethod(emoji.set_color, random.choice(colors)) for emoji in emojis],
run_time=1, rate_func=there_and_back
)
# 暂停以查看最终场景
self.wait(2)
if __name__ == "__main__":
from manim import config, tempconfig
config.background_color = "#faf7f0" # 背景色
EmojiPattern().render()
将此代码保存为emoji_pattern.py
,然后在命令行中运行以下命令来生成视频:
manim -pql emoji_pattern.py EmojiPattern
最后,介绍下Manim如何设置生成的视频分辨率。
Manim可以生成多种分辨率的视频:
480p (SD) 720p (HD) 1080p (Full HD) 1440p (2K) 2160p (4K)
你可以通过在命令行中使用 -r
选项来指定输出视频的分辨率。以下是不同分辨率的视频生成命令示例:
生成 480p 分辨率的视频:
manim -pql -r 854,480 pillow_example.py
生成 720p 分辨率的视频:
manim -pql -r 1280,720 pillow_example.py
生成 1080p 分辨率的视频:
manim -pql -r 1920,1080 pillow_example.py
生成 1440p 分辨率的视频:
manim -pql -r 2560,1440 pillow_example.py
生成 2160p (4K) 分辨率的视频:
manim -pql -r 3840,2160 pillow_example.py
其中,-pql
参数用于快速渲染和低质量预览。如果你希望高质量渲染,可以将 -pql
替换为 -pqh
。例如,生成 1080p 高质量视频的命令为:
manim -pqh -r 1920,1080 pillow_example.py
结语
后续我会与大家分享更多关于使用Manim的心得体会。
实践过程中,Claude有时生成的Manim代码视频渲染不错,推荐大家可以多尝试不同LLM。
欢迎在评论区留言,让我们一起交流进步。
精选历史文章,请看这里:
轻松构建你的第一个 AI 项目:使用 Replit 和热门 API 搭建你的应用
Google 新推出 AI 辅助工具,Data Science Agent 和 Code Transformation 值得一试
用 Marp 让 Markdown+AI 快速制作 PPT,让你的演示更出彩