ARTICLE · 1085032
不会 3D,我让 AI 写代码,Blender 自己演了一段动画
先看这段动画:红球慢慢浮起又落下,立方体原地自转,圆环来回翻转,相机一边绕着场景转、一边缓缓推近。一共十二秒,二百八十八帧。
我没建一个模、没打一盏灯,甚至没有打开 Blender 的界面。这些画面是 AI 写 Python 脚本、在命令行后台自己渲出来的。
这篇文章把整个过程拆开讲:从一台连 Blender 都没装的机器开始,我怎么提需求,它怎么写代码,中间踩了哪两个坑,最后怎么把几百张图合成成片。你能拿走的,是一套可以直接复用到 Blender、以及其他支持脚本的专业软件上的做法。
01|先看成片:动画是自己长出来的

场景里有四个物体:红色的球、绿色的立方体、蓝色的圆环、黄色的圆锥。它们各自有独立的动作,加上一台会环绕、会推近的相机。
这些不是我手动一帧帧调出来的。我做的事情,是用自然语言描述我想要什么,然后让模型把这段话翻译成 Blender 能执行的 Python 代码,再在后台跑完渲染。换句话说,我负责说清楚要什么,代码和渲染都交给它。
02|Blender 是什么,为什么能被脚本驱动
Blender 是一个开源的 3D 创作软件,建模、绑骨骼、做动画、出渲染图、甚至剪辑,这一整套专业 3D 的活它都能干。功能很全,门槛也确实不低。
关键在于,Blender 内置了一套叫bpy的 Python 接口。你在界面上点的每一个按钮——新建一个球、打一盏灯、给物体加关键帧、点渲染——背后都对应一个 bpy 函数。这意味着整个软件是可以用代码驱动的:
# 新建一个半径 0.6 的球,放在指定坐标
bpy.ops.mesh.primitive_uv_sphere_add(radius=0.6, location=(-2.7, 0, 0.6))
# 在第 1 帧和第 144 帧各打一个位置关键帧,中间就有了动画
red_sphere.keyframe_insert(data_path="location", index=2, frame=1)
red_sphere.location.z = 1.3
red_sphere.keyframe_insert(data_path="location", index=2, frame=144)既然界面操作都能等价成代码,那“做 3D”这件事就可以被抽象成“写一段脚本”。我不需要学会 Blender 的界面,只需要把需求讲明白,让 AI 替我写 bpy。
03|真实起点:这台机器连 Blender 都没装
为了证明这不是“事先配好环境再演示”,我直接在一台干净的机器上开始。第一步检查环境,结果很直接:
$ which blender
blender not found
$ ls /Applications | grep Blender
(空)那就让它从安装开始自己想办法。它先尝试常规的命令行安装,结果卡住了:
$ brew install --cask blender
……长时间无响应,卡死常规路径走不通,它没有反复重试同一条命令,而是换了思路:直接下载官方安装包,并且在命令里加了断点续传和超时判断,后台慢慢拉:
$ curl -C - --speed-time 15 -O blender-5.2.1-macos-arm64.dmg
100% 346MB 断点续传完成
$ hdiutil attach … && cp -R Blender.app /Applications
✓ Blender 5.2.1 LTS 安装完成我比较在意的一点是:安装失败后它没有死磕,而是换了一条可验证的路径。下载用断点续传,中途断了能接着下;装完还回读了一次版本号,确认确实是 5.2.1 LTS 再往下走。这几步我没有插手。
04|静态场景一次成,再加到 288 帧
环境就绪,先做最简单的静态场景验证链路。一段脚本下去,地面、灯光、四个物体、材质全部自动建好,一渲染就成了:

静态图没问题,我提了新要求:太短了,要一段十几秒、会动的成片。于是它把脚本扩成完整动画,写了 288 帧:红球上下浮动同时自转,立方体转两圈,圆环来回翻转,圆锥反方向转,相机绕着场景转 35 度、同时往前推近。


这里有个细节。第一版动画渲出来,末帧的圆锥被画面切掉一角,红球和立方体因为透视挤在一起。我把这个问题指出来,它的做法是重新调整相机的起始和结束距离:起点拉远一点、终点收一点,让推近的幅度更克制,重渲之后四个物体在每一帧都完整、不挤、不出画。功能跑通和画面能看,是分开迭代的两件事。
05|两个真实的坑,都是报错驱动修的
整个过程不是一帆风顺,但修 bug 的方式很统一:把真实报错原样丢回给模型,让它定位根因,再改代码。
第一个坑:Blender 新版改了动画接口。第一版脚本直接崩了:
Traceback (most recent call last):
File "scene_anim.py", line 41, in set_linear_interpolation
for fcurve in obj.animation_data.action.fcurves:
AttributeError: 'Action' object has no attribute 'fcurves'旧版本里,动画关键帧直接挂在 action.fcurves 上。但 Blender 这一代换成了 slotted action 的结构,fcurves 不再直接暴露。模型给出的新写法是一层层往下找:
# 旧写法(已失效):action.fcurves
# 新写法:layers -> strips -> channelbag(slot) -> fcurves
for layer in action.layers:
for strip in layer.strips:
cb = strip.channelbag(slot)
cb.fcurves # 关键帧在这里换成新版结构之后,这一遍就改好了。
第二个坑:这个版本不能直接输出视频。我本想让它直接渲成 mp4,又报错:
TypeError: enum "FFMPEG" not found in (
'AVIF', 'JPEG', 'OPEN_EXR', 'PNG', 'WEBP', 'BMP',
'CINEON', 'DPX', 'IRIS', 'JPEG2000', 'HDR',
'TARGA', 'TARGA_RAW', 'TIFF')这个 Blender 构建没有内置视频编码,输出格式里只有静态图像。那就绕一步:先把 288 帧全部渲成 PNG 序列,再用外部的 ffmpeg 把图片合成为 mp4。
$ ffmpeg -framerate 24 -i frame_%04d.png anim.mp4这两个坑的共同点是:都不是模型“不会写动画”,而是环境和版本的具体约束。它需要读懂报错、知道这是 Blender 版本差异、再给出符合当前版本的写法。这种对着真实环境来回磨的能力,比一次性写出漂亮代码更接近实际干活。
06|它“会”在哪,边界又在哪
把整条链路串起来,其实是这样一条流水线:
一句话需求 → Python 脚本 → Blender 后台渲染 → 成片我认为这件事真正的意义,是专业软件也能被自然语言“编程”了。你说想要什么,模型把它翻译成软件能执行的具体操作,再把结果交还给你。过去要先学很久软件才能做出来的东西,现在可以先用一句话验证方向、看到结果,再决定要不要深入。
但边界也要讲清楚,它不是万能的:
• 复杂创作的方向、审美和取舍,还得人来定。模型能执行“让相机绕着转”,但“为什么这个镜头要这么转”是创作者的判断。 • 版本兼容、环境配置这类坑,往往要来回磨几轮,不是一次就成。 • 它能帮你把东西做出来,但不替你理解做出来的是什么。关键步骤你得看得懂、验得了。
07|写在最后
回到开头那段动画。从安装软件、建场景、写 288 帧、修两个报错,到最后合成成片,我没有手写一行代码,这套流程已经能稳定跑通。
如果你也想试,最小的一步是:挑一个支持脚本的软件,用一句话描述一个足够小的结果(比如“建三个几何体、打一盏灯、渲一张图”),让模型写出脚本并真的跑一遍,再根据报错迭代。先看到结果,再逐步加难度。
你想用这种“说句话就让软件自己干活”的方式,做点什么?
关于作者
我是老罗,一个持续学习和实践新技术的程序员。我会把学到的知识、做过的项目和踩过的坑,整理成普通人能看懂、真正能用起来的内容。
把电脑、网络和 AI 的问题讲明白,让你少踩一点坑。