Manim 动画制作不再难:ChatGPT + Graphviz/Mermaid 助你快速上手
引言
前两篇文章介绍了Manim的基础知识,今天我们来探索如何结合GPT、Mermaid、Graphviz等工具,更高效地制作出更复杂的动画效果。
Manim + ChatGPT 实战:模仿苹果 WWDC 动画效果
Manim + ChatGPT 实践:零基础也能制作酷炫动画
分享数学动画的制作
新升级的iPadOS上的计算器APP很火,支持手写公式,即时出结果。
这让我想到是否可以利用Manim库来展示数学计算过程。
Manim库主要用于数学动画的,之前我没有展示过过程,今天演示一下。
我请GPT写出计算过程,用Manim制作了动画。
视频效果
完整代码
SolveEquation
from manim import *
class SolveEquation(Scene):
def construct(self):
# 引入方程和问题
equation = MathTex("3x + y = 3")
condition = MathTex("x = 3")
problem = Text("计算 y 的值")
# 布局调整
equation.to_edge(UP)
condition.next_to(equation, DOWN)
problem.next_to(condition, DOWN)
self.play(Write(equation))
self.play(Write(condition))
self.play(Write(problem))
self.wait(1)
# 代入条件和计算步骤
calculation_steps = [
MathTex("3x + y = 3"),
MathTex("3(3) + y = 3"),
MathTex("9 + y = 3"),
MathTex("y = 3 - 9"),
MathTex("y = -6")
]
for step in calculation_steps:
step.next_to(problem, DOWN, buff=0.5)
self.play(Write(step))
self.wait(1)
problem = step # 更新位置
# 验证结果
verification = MathTex("3(3) + (-6) = 3")
verification2 = MathTex("9 - 6 = 3")
verification.next_to(problem, DOWN, buff=0.5)
verification2.next_to(verification, DOWN, buff=0.5)
self.play(Write(verification))
self.wait(1)
self.play(Write(verification2))
self.wait(1)
# 总结
summary = Text("当 x = 3 时,y = -6")
summary.next_to(verification2, DOWN, buff=1)
self.play(Write(summary))
self.wait(2)
if __name__ == "__main__":
SolveEquation().render()
EquationGraph
from manim import *
class EquationGraph(Scene):
def construct(self):
# 创建坐标系
axes = Axes(
x_range=[0, 5, 1],
y_range=[-10, 5, 1],
axis_config={"color": BLUE},
)
labels = axes.get_axis_labels(x_label="x", y_label="y")
# 创建方程图像
graph = axes.plot(lambda x: 3 - 3 * x, color=YELLOW)
graph_label = axes.get_graph_label(graph, label=Tex("3x + y = 3"), x_val=0.5, direction=UP)
# 创建点并标注 (3, -6)
x_value = 3
y_value = 3 - 3 * x_value
point = Dot().move_to(axes.coords_to_point(x_value, y_value))
point_label = MathTex("(3, -6)").next_to(point, RIGHT)
# 动画效果
self.play(Create(axes, run_time=3), Write(labels, run_time=3))
self.play(Create(graph, run_time=3), Write(graph_label, run_time=3))
self.play(Create(point, run_time=2), Write(point_label, run_time=2))
self.wait(2)
if __name__ == "__main__":
EquationGraph().render()
善用工具:用Mermaid和Graphviz简化Manim动画制作
在昨天的文章里,我尝试了通过Tldraw画出草图,然后让Manim制作动画。
今天想起,我们有很多现成的制图工具,是否可以通过它们,来帮我们画出更好的图表,然后再让Manim制作动画呢?
因为LLM对规范语言的识别率高于自然语言,所以我选择使用Mermaid和Graphviz生成结构化的图形代码,再由GPT转换为Manim代码。
最终,我选定2个工具:Graphviz和Mermaid。
特性 | Mermaid | Graphviz |
---|---|---|
语法 | Markdown风格的图形描述语言 | 使用DOT语言进行描述 |
易用性 | 适合初学者,易于集成到Markdown文档中 | 相对复杂,需要一定的学习曲线 |
集成 | 常用于Markdown、GitHub、Jupyter Notebook等 | 可与多种编程语言和工具集成 |
图形种类 | 支持流程图、序列图、甘特图、状态图等 | 支持流程图、层次图、状态图、网络图等 |
定制化 | 提供基础的样式定制选项 | 高度可定制,支持复杂的图形和布局 |
除了以上2种,你也可以考虑PlantUML。
GPT+Mermaid+Manim:快速制作流程图动画
我将Mermaid代码发给GPT,让它写Manim的代码。
视频动画效果
完整代码
from manim import *
class Flowchart(Scene):
def construct(self):
# Nodes
start = Text("开始").to_edge(UP)
condition = Text("判断条件").next_to(start, DOWN, buff=1.5)
process1 = Text("处理1").next_to(condition, LEFT, buff=2)
process2 = Text("处理2").next_to(condition, RIGHT, buff=2)
end = Text("结束").next_to(condition, DOWN, buff=1.5)
# Boxes
start_box = SurroundingRectangle(start, color=BLUE, buff=0.2)
condition_box = SurroundingRectangle(condition, color=BLUE, buff=0.2)
process1_box = SurroundingRectangle(process1, color=BLUE, buff=0.2)
process2_box = SurroundingRectangle(process2, color=BLUE, buff=0.2)
end_box = SurroundingRectangle(end, color=BLUE, buff=0.2)
# Lines and arrows
start_to_condition = Arrow(start_box.get_bottom(), condition_box.get_top(), buff=0.1)
condition_to_process1 = Arrow(condition_box.get_left(), process1_box.get_right(), buff=0.1)
condition_to_process2 = Arrow(condition_box.get_right(), process2_box.get_left(), buff=0.1)
process1_to_end = Arrow(process1_box.get_bottom(), end_box.get_top(), buff=0.1)
process2_to_end = Arrow(process2_box.get_bottom(), end_box.get_top(), buff=0.1)
# Labels on arrows
condition1_label = Text("条件1").scale(0.5).next_to(condition_to_process1, UP, buff=0.1)
condition2_label = Text("条件2").scale(0.5).next_to(condition_to_process2, UP, buff=0.1)
# Adding to the scene
self.play(Write(start), Create(start_box))
self.play(Write(condition), Create(condition_box))
self.play(Write(process1), Create(process1_box))
self.play(Write(process2), Create(process2_box))
self.play(Write(end), Create(end_box))
self.play(Create(start_to_condition))
self.play(Create(condition_to_process1), Write(condition1_label))
self.play(Create(condition_to_process2), Write(condition2_label))
self.play(Create(process1_to_end))
self.play(Create(process2_to_end))
self.wait(2)
if __name__ == "__main__":
from manim import config
config.background_color = WHITE
scene = Flowchart()
scene.render()
GPT+Graphviz+Manim:苹果产品发展史
我先请GPT用Graphviz介绍下苹果的历史优秀产品。
根据dot文件,制作Manim动画。
逐步修改
最终视频效果
GPT+Graphviz+Manim:人工智能领域分支
我请GPT介绍人工智能领域和分支领域。
转成Graphviz样式。
根据dot文件,制作Manim动画。
偶尔需要鞭策下偷懒的GPT。
部分画面内容需要调整
最终视频效果
结语
后续我会与大家分享更多关于使用Manim的心得体会。
欢迎在评论区留言,让我们一起交流进步。
精选历史文章,请看这里:
轻松构建你的第一个 AI 项目:使用 Replit 和热门 API 搭建你的应用
Google 新推出 AI 辅助工具,Data Science Agent 和 Code Transformation 值得一试
用 Marp 让 Markdown+AI 快速制作 PPT,让你的演示更出彩