
说句实话看到“GPT-6 Astra built this beautiful math animation in one go”这个标题的时候我第一反应是标题党又来骗点击了吧。但点开视频看完我人麻了——不是生成一张静态的函数图而是完整的一整套数学动画坐标轴、函数曲线、切线、动态标签甚至连“音效卡点”都做出来了全过程就是一句自然语言描述没有人工写一行动画代码。作为用Manim做数学可视化做了三年多的人我最清楚这件事以前有多费劲公式排版、坐标系对齐、动画节奏、元素配色哪一项都够折腾半天。这篇文章我想用工程化的视角把这次“一次生成数学动画”背后真正发生的事情拆开来讲。我会聊一聊它依赖的底层能力、为什么“代码渲染”路线比“直接生成视频”更靠谱、普通人怎么用类似思路复现完整工作流以及我在实操中踩过的坑和排查方法。不管你是做科普视频、数学课件还是单纯对AI生成可视化内容感兴趣这篇应该都能给你一些可以直接上手的参考。1. GPT-6 Astra 这波“一次生成”背后到底发生了什么1.1 数学动画为什么以前“很难自动做”先把话说清楚数学动画和普通动画片完全是两个物种。普通动画追求的是“看起来流畅”数学动画追求的是“每一步都经得起推敲”。所以它有几个很抽象的难点以前很难靠AI直接搞定。第一个难点是公式的可读写性。数学动画里到处都是LaTeX公式比如 $\int_{a}^{b} f(x) dx$ 这种结构AI如果只是“画一个符号”而不是“生成一段可编译的公式代码”那渲染出来大概率是符号错位、下标乱飞根本不能用。视频里的动画之所以漂亮关键在于公式本身是用规范代码生成的而不是像素推测。第二个难点是坐标转换。数学对象天生生活在抽象的坐标系里但屏幕是像素坐标系。你要让一个抛物线 $y x^2 - 2x 1$ 在屏幕上精确地穿过点 $(1,0)$就需要把数学坐标映射到画布坐标涉及缩放、平移、比例保持。很多AI生成视频在“形”上很像但一到关键数值就漂移就是因为没有真正的数学坐标意识。第三个难点是时序控制。数学动画的精髓是“先展示什么再展示什么”。比如讲导数你得先画曲线再画割线然后割线逼近变成切线。这个过程的时间顺序错了整个教学逻辑就崩了。传统视频生成模型是“逐帧预测”它很难理解“割线逼近”这种需要精确中间态的抽象过程。我在实际做数学动画时最怕的就是这三件事同时出问题。以前每次都得手动调LaTeX包、手动对齐坐标轴标签、手动设置动画的等待时间。所以看到GPT-6 Astra能“一句prompt生成完整动画”我的第一反应不是“哇它好聪明”而是“它到底是通过什么管线做到的”。1.2 能力拆解从自然语言到可渲染代码中间发生了什么结合这个演示视频和社区里的复现案例我认为这类“一次生成”本质上走的是“指令理解 - 结构化拆解 - 生成代码 - 环境渲染”的路径而不是直接让AI输出一个MP4文件。这个区别很关键。第一步是多模态指令理解。你输入“帮我做一个单摆运动并同时展示角度随时间变化的正弦曲线”模型需要把这个自然语言拆解成几个明确的数学对象一个摆锤、一条摆线、一个角度标注、一个坐标系、一条正弦曲线。这背后是对空间关系和函数关系的跨模态理解不是简单的关键词匹配。第二步是生成可执行的渲染代码。这比直接生成像素视频高明得多。因为代码是确定性的同一个函数表达式在数学上是精确的同一个动画参数运行十次结果都一样。这意味着结果可复现、可修改、可重新渲染。我现在做内容最需要的就是这种“可改”的能力。如果AI只给我一段视频我改个小标题都得重新生成但如果给我代码我改几个参数就能出无限个变体。第三步是自动渲染和自检。现在很多AI工作流里会内置一个“写代码 - 跑代码 - 看报错 - 修复代码 - 再跑”的循环。这也是为什么演示看起来像“一次生成”其实背后可能已经悄悄迭代了很多轮。从我自己的经验来看模型能自己调用Python环境跑一遍Manim然后读取渲染日志里的报错信息再调整代码这个能力比“生成漂亮代码”更有价值。因为数学动画的代码第一次跑通率通常不高能自愈才是真本事。理解了这个逻辑你就会明白这次演示最大的亮点不是“AI会画图”而是“AI会编程式地构建一个数学世界”。这个思路对创作者来说价值是完全不同的前者是素材后者是生产力。2. 数学动画的制作方案选型为什么“代码渲染”路线完胜“直接视频生成”2.1 主流数学动画工具对比Manim、Matplotlib、Three.js、Processing等先上一张我自己整理的对照表都是这些年做可视化常用的工具。工具定位数学表达力动态效果上手难度典型应用场景Manim社区版数学动画引擎极强强支持复杂动画编排中高数学科普视频、教学动画Matplotlib ArtistAnimation科学绘图库强一般偏静态图轮播低数据分析、论文配图Three.js / WebGL3D图形库中强极强高3D数学可视化、交互网页Processing / p5.js创意编程中强低创意生成艺术、互动演示文生视频工具视频生成模型弱强极低概念宣传、风格化场景从表里能看出来如果目标是“把数学原理讲清楚”Manim这类代码渲染工具拥有不可替代的优势。它支持LaTeX公式渲染、坐标系统变换、逐帧动画控制、3D场景而且输出的视频是矢量级别的放大多少倍都不糊。我个人的科普视频几乎90%都是Manim做的。Matplotlib更适合“快速验证一个数学想法”比如你想看一个函数在参数变化下怎么变形用它的交互滑块能很快搞定。但真要做成一段有叙事节奏的视频Matplotlib的动画API就很吃力了你得自己管理帧率、颜色变化、元素显隐代码写起来又长又丑。Three.js则适合做浏览器内可交互的3D数学体验。比如你做一个三维曲面用户可以用鼠标拖动看不同角度这种交互是Manim拍视频给不了的。缺点是数学公式渲染很麻烦通常得叠加MathJax或者纹理贴图工程量一下就上来了。至于Processing我把它定位成“快速创意原型”工具适合做一些随机分布、分形生长这类的视觉实验。它的语法很友好但缺少LaTeX和坐标轴等数学动画的“基础设施”真要严谨地讲数学定理还是差口气。2.2 选型逻辑可控性、可复用性、数学精度一个都不能少很多刚接触这个领域的朋友问我“现在文生视频这么强为什么不直接让它生成一段函数动画”我的回答是你可以让它生成一个“看起来像数学动画”的演示但它很难生成一个“准确表达数学关系”的演示。我做过一个简单的测试让文生视频模型生成“一个二次函数抛物线顶点在(1, -2)开口向上”。生成的画面里确实有条抛物线但你放大看坐标网格顶点位置对不上甚至y轴刻度都是乱的。原因很简单模型学习的是“抛物线的视觉模式”它没有在内部建立一个函数表达式。数学动画的命根子是精确每一帧的坐标都应该能追溯到某个公式这一点只有代码渲染能保证。代码渲染还有一个隐藏优势可复用性。我有一套自己写的Manim模板包含片头标题动画、坐标轴默认样式、颜色主题、字幕样式。AI帮我生成新动画时只要告诉它“按照我提供的模板风格写代码”它就能产出和我之前视频风格完全统一的内容。这对我来说是刚需因为我做系列视频风格统一比单个视频好看更重要。再有一点是可控性。视频生成模型给不了你“每一帧的精确状态”但代码渲染可以。比如我想让曲线在 t5 秒时恰好运动到某个位置我直接改代码里的参数就行。我还经常需要把动画导出成不同分辨率版本代码渲染只要重新设定像素比例渲染一次即可文生视频模型做不到这一点。所以我的观点很明确视频生成模型适合做“氛围感”素材而数学动画这种“信息密度高、逻辑严谨”的内容必须走代码渲染。GPT-6 Astra这次演示之所以让我觉得变了天不是因为它跳过了代码恰恰是因为它把“从自然语言到代码”这段最耗时的路走通了。3. 用AI辅助生成数学动画的完整实操流程3.1 准备环境先装好工具链别在环境上浪费时间如果你想把这套工作流跑起来第一步不是写prompt而是把本地渲染环境装好。我用的是macOSWindows和Linux的差别也不大核心就三样Python环境、Manim库、FFmpeg。Manim是MIT开源的数学动画引擎社区版叫ManimCE安装很直接pip install manim如果你需要渲染带数学公式的视频还需要一个LaTeX发行版。macOS上推荐装MacTeX的Basic版Linux用texliveWindows可以用MiKTeX。这里有一个坑LaTeX体积很大装起来要花点时间但如果你只渲染简单公式比如函数表达式不装完整版也能跑Manim内部默认使用一个简化的公式渲染器不过效果差点。FFmpeg负责把渲染出来的帧序列合成视频这个必须装。macOS执行brew install ffmpeg装完之后建议先跑一个最简单的场景测试环境manim -pql test.py# test.py from manim import * class Test(Scene): def construct(self): circle Circle() self.play(Create(circle))如果这个能弹出一个窗口播放圆的生成动画说明工具链已经通了。整个环境安装大概需要20到40分钟其中大部分时间都花在下载依赖上。3.2 提示词模板让AI稳定生成可渲染代码的提问方法环境就绪后最核心的问题是“怎么问”。我在反复测试中发现给AI的提示词里必须包含四个部分角色预设、任务描述、输出格式、约束条件。下面是我用下来成功率最高的模板。你现在是一个资深的Manim动画工程师。请根据以下需求生成完整的Python动画代码。 任务制作一个单摆运动的动画并在画面右侧同步展示摆角随时间变化的正弦曲线。要求 1. 使用Manim社区版代码可直接运行。 2. 左侧画布展示单摆固定点、摆杆线段、摆锤圆形并标注角度theta。 3. 右侧坐标轴显示正弦曲线随着摆锤运动同步绘制。 4. 使用电视风格配色背景深色曲线用亮黄色。 5. 动画总时长控制在15秒左右。 输出格式直接给出完整Python代码并附带运行命令。这个模板的作用是把“意图”和“约束”都交代清楚。数学动画代码最怕的是模型自由发挥比如自己发明一个不存在的函数接口。在提示词里明确“使用Manim社区版”可以很大程度避免这个问题。我还有一个习惯第一次生成后要求AI附带渲染命令。通常运行命令都会包含在输出里但你不说它有时候会漏。命令格式一般是manim -pql single_pendulum.py SinglePendulum-q代表画质l是低清实测中先用低清快速验证动画逻辑确认没问题后再用-qh渲染高清版本。这个小习惯能帮你省下大量时间因为高清渲染一帧要好几秒整段动画渲染一次可能就是十几分钟如果逻辑有错就白等了。3.3 完整示例从需求描述到可运行动画代码下面我写一个具体的例子。需求很简单“画一个质点在圆周上匀速运动同时把它在水平方向的投影随时间的变化画成正弦函数”。第一次让AI生成它给了大致这样的代码结构我简化过去掉了复杂的样式# circular_to_sine.py from manim import * import numpy as np class CircleToSine(Scene): def construct(self): # 左侧单位圆 circle Circle(radius1, colorBLUE).shift(LEFT * 3) dot Dot(colorYELLOW) # 角度线 angle_line always_redraw( lambda: Line(circle.get_center(), dot.get_center(), colorYELLOW) ) # 右侧坐标轴 axes Axes( x_range[0, 2 * np.pi, np.pi / 2], y_range[-1.5, 1.5, 1], x_length5, y_length3, ).shift(RIGHT * 2) # 正弦曲线后面动态绘制 graph axes.plot(lambda x: np.sin(x), colorGREEN) dot.move_to(circle.point_from_proportion(0)) self.add(circle, angle_line, dot, axes) self.play( MoveAlongPath( dot, circle, rate_funclinear, ), Create(graph), run_time5, )这段代码第一次跑的时候有几个问题。第一dot没有随着圆周运动更新水平投影它只是在圆周上转。第二正弦曲线是一次性Create出来的不是“随着投影同步绘制”。所以我让AI修了两轮最终加了两个关键的always_redraw一个在圆上算投影点的y坐标一个往右侧正弦曲线上画一个同步移动的点。修改后核心逻辑是这样# 左侧质点运动 self.play( MoveAlongPath(dot, circle, rate_funclinear), run_time5, ) # 右侧同步投影点 proj_dot Dot(colorRED) proj_dot.add_updater( lambda d: d.move_to(axes.c2p(0, dot.get_center()[1])) )这段代码里最重要的是axes.c2p方法它把“数学坐标系里的坐标”转换成“屏幕坐标”这正是数学动画精确性的来源。你只需要告诉它数学坐标它自动帮你算好画面位置。渲染命令是manim -pql circular_to_sine.py CircleToSine实际跑出来的效果基本达到了我的预期左侧质点在圆周上匀速转动右侧一条正弦曲线从左到右被“画”出来同时上面有个红点一直在标注当前时刻的y值。整个过程大约5秒逻辑清楚画面干净。4. 实操中常见的5个坑与排查清单4.1 公式和中文渲染乱码是最常见也最坑的问题Manim渲染LaTeX公式需要系统里有可用的TeX环境否则公式会渲染成一段报错信息。我遇到过的情况是公式里用了\begin{aligned}这类需要amsmath宏包的语法但Basic版TeX里没装导致渲染失败。解决办法是装完整版或者在代码开头声明需要的宏包config.tex_template.add_to_preamble(r\usepackage{amsmath})中文乱码则是另一个故事。Manim默认的字体不支持中文直接写中文文字会变成方框。解决办法是手动指定一个中文字体比如Text(正弦函数, fontPingFang SC)macOS上一般用PingFang SC没问题Linux上需要装Noto Sans CJK。这也是为什么我在生成动画时如果要做中文版会在提示词里直接要求“所有文字使用Text对象并设置字体为Noto Sans CJK”。4.2 AI生成的动画节奏不对怎么办这是“能用但不好看”的一类典型问题。AI默认生成的动画速度经常是匀速的但数学讲解需要“重点慢、过渡快”。我的经验是给AI提供具体的run_time和rate_func参数。比如讲解时希望曲线生成过程是“先快后慢”这样结尾更聚焦。我会明确要求绘制正弦曲线时rate_func使用smoothrun_time设为5秒。如果不指定AI经常用线性速率看起来像PPT翻页一点质感都没有。这里多说一句Manim里rate_func控制动画的速度曲线smooth是缓入缓出linear是匀速there_and_back是过去再回来。做科普视频时我几乎只用smooth因为视觉上最舒服。4.3 坐标系跑偏数学关系对不上AI生成代码时经常会出现Axes的x_range和函数实际定义域不匹配的问题。比如你要求画 $y \tan(x)$AI可能默认把x_range设定在[-5, 5]结果正切函数的渐近线把画面切割得乱七八糟。解决办法是在提示词里强制约定坐标轴范围。我会加一句x轴范围从-4到4y轴范围从-8到8并在渐近线位置用虚线标注。坐标轴范围这种信息AI自己是很难“想当然”猜对的。你在需求越明确它的结果越精确。4.4 生成太长的动画导致渲染崩溃有一段时间我总想让AI一次性生成一个“完整课程片段”比如从抛物线的定义讲到切线斜率再到导数整个过程两分钟。结果代码长度直接破了200行里面还有大量复杂的动画嵌套。Manim渲染这种长场景时有时会遇到内存飙升或渲染超时。我的经验是“一次只做一个知识点”。把长动画拆成多个Scene类分别渲染成好几个小视频最后用剪辑软件拼起来。这个习惯还有一个额外好处任何一个知识点的动画出了问题只要重渲染那一个小片段就好不用全盘重来。4.5 结果无法编辑反复修改很痛苦最后一个坑来自AI本身的“幻觉代码”。它会使用一些看上去合理但实际不存在的Manim接口比如TransformFromTo这种我印象里Manim根本没这个API。第一版跑出来直接报AttributeError。我的排查套路很固定先把报错信息原样丢回给AI让它自己看报错并修复。这一步能解决80%的问题。如果两三次还修不好我就会去Manim官方文档查对应接口把正确写法发给它作为参考。长年累月下来我的提示词工程里积累了十几条“常见接口修正笔记”相当于一个微型的错误知识库。5. 从创作者和教学者视角我看到的实际影响5.1 科普视频制作的“卡点”提前消失了以前做一期数学科普视频整个流程大概是定主题、设计脚本、手写Manim代码、渲染、剪辑、配字幕、找音效。其中最耗精力的不是写脚本而是把脑子里的分镜“翻译”成动画代码。一个普通的背景动画可能要花一个晚上现在AI在几分钟内把基础代码写好我只需要调整细节和风格时间至少节省一半以上。最直观的改变是“试错成本”变低了。以前我有个想法比如“想看看两个变量互相带动时动画效果怎么样”光是写这组代码就需要半天经常写着写着觉得不划算就放弃了。现在我可以让AI快速生成一个粗糙版本看到结果后再决定要不要继续优化。用这种“低门槛试错”的方式我一个月做的动画主题数量比以前多了一倍。5.2 对教学课件的意义不只是节省时间作为一个偶尔做教学分享的人我特别看重“从抽象到直观”的转化。以前讲微积分的中值定理我只能画静态图学生很难体会“曲线上存在一点切线平行于割线”这个动态内涵。现在我可以要求AI生成一个动态演示割线从一侧缓缓向目标点平移逐渐变成切线然后在切点位置高亮标注。这个过程对理解拉格朗日中值定理帮助很大。更进一步的玩法是让AI同时生成“教师讲解版”和“学生探究版”两个动画。教师版节奏快、重点有标注学生版节奏慢、有交互式留白让学生自己拖动滑块观察变化。这个想法放在以前制作成本高得没法落地现在有了AI辅助生成代码做两个版本的边际成本就很低了。5.3 这件事真正的边界在哪里AI确实把“从想法到成片”的距离缩短了一个量级但“想法”本身仍需人来提供。GPT-6 Astra能帮你把“展示单摆运动与正弦函数关系”变成一段优美的动画但它不会主动问“你有没有想过用傅里叶级数解释这个现象”选题、教学策略、叙事逻辑这些高阶的创造工作依然依赖人的经验。在我自己的实践里最有效的配合方式是“我来定路径AI我来填细节”。比如我先在纸上画出分镜第一屏展示什么问题、第二屏引入什么概念、第三屏怎么总结。然后把这个分镜稿喂给AI让它在每个环节里生成对应的动画片段。这样产出的视频既有教学逻辑又有制作效率是纯粹让AI自由发挥比不了的。最后分享一个我个人的小习惯每次拿到AI生成的动画代码我不急着全量渲染而是先通读一遍代码里的construct方法和动画流程。不是因为我信不过AI而是因为通读的过程能帮我重新理解这个数学对象的运动过程。有时候读着读着反而会发现更巧妙的展示方式。这种感觉大概是做可视化的人独有的乐趣吧。