从一个提示词到四个镜头的 Blender 电影短片
十二秒的镜头序列听起来不长。但在 Blender 里,这是一大堆工作:场景调度、关键帧、运镜、景深,还有一张必须像纸一样弯曲、而不是像布一样飘的纸。大部分工作都要在视口里一次次点击完成。
所以我们把整个任务交给了智能体。借助 Eigent 中的 Gemini 4,一个提示词就把 Cozy Kitchen 场景变成了一段四个镜头的电影短片。一阵穿堂风把食谱卡片从支架上吹起,带着它穿过厨房,最后让它轻轻搭在一个草莓挞上。Gemini 4 从来没有打开过 Blender 窗口。它编写 Blender Python,以无头模式运行,检查自己的成果,并修复发现的问题。
完整流程一览
你只需准备场景和任务说明,其余工作由 Gemini 4 在命令行中完成。每个阶段都会留下文件,方便你随时检查进度。
| 阶段 | 做什么 | 得到什么 |
|---|---|---|
| 读取 | 以无头模式打开场景并加载任务数据 | 卡片起始点的测试渲染 |
| 布景 | 添加食谱支架、窗帘杆和风的线索 | 一个让穿堂风有可见来源的场景 |
| 制作 | 为食谱卡片建模并添加贴图 | RecipePage,一张带手绘食谱卡的薄双面纸 |
| 动画 | 拟合穿过通道的路径,以及搭在草莓挞上的形态 | 平滑的飞行和有支撑的静止褶皱 |
| 拍摄 | 布置四台摄像机并绑定到剪辑点 | 四个镜头的剪辑,镜头 2 和 3 带景深 |
| 验证 | 测量任务说明中的每条规则并修复不达标项 | work/ 中可重复运行的检查脚本 |
| 交付 | 渲染静帧和分镜图,写出镜头表 | sequence.blend、shotlist.csv、storyboard.png 和九张静帧 |
下面是自己动手的分步教程,也包括一个我们下次会换种方式设置的地方。
你将得到
- 一个可编辑的 Blender 项目:
sequence.blend,13 MB,所有图片均已打包,没有链接的库。打开就能继续工作。 - 一份镜头表:
shotlist.csv,每个镜头一行,包含帧范围、摄像机和动作。 - 一张分镜图:
storyboard.png,九个带标注的 640×480 画面,排成 3×3 网格。 - 九张静帧:第 1、48、73、120、145、192、217、264 和 288 帧。
- 一段视频和一个预览页面:
sequence.mp4和preview.html,来自一次简短的追加请求。
开始之前
- 在你的电脑上安装 Eigent。
- Gemini 4:通过 Eigent Cloud 使用,或使用你自己的 Gemini API 密钥。
- 同一台电脑上的 Blender。Gemini 4 通过命令行驱动它,所以从不需要打开窗口。我们安装的是 Blender 5.2 LTS。如果你更想在沙箱里运行,任务包里也附带一个固定
bpy5.2.2 的 Docker 镜像。 - 任务包。我们用的是 3D 编程环境中的“recipe-page mishap”:
| 文件 | 为智能体提供什么 |
|---|---|
PROMPT.md | 任务说明,也是你唯一要发送的消息 |
agent_environment/input/kitchen.blend | 准备好的 Cozy Kitchen 场景 |
agent_environment/input/subjects.json | 构成草莓挞的对象 |
agent_environment/input/action.json | 卡片的起始点,以及第 120、168 和 192 帧的飞行通道 |
agent_environment/input/presentation.json | 静帧和分镜图设置 |
agent_environment/input/source_overview.png | 未改动场景的预览 |
agent_environment/scripts/ | presentation.py(渲染静帧和分镜图)和 review.py |
选择 Gemini 4
使用 Eigent Cloud,无需 API 密钥:
- 在主屏幕上,打开输入框下方的 模型选择器。
- 在 Eigent 下选择 Gemini 4 Argon。
使用你自己的 Gemini API 密钥:
- 打开 Settings → Models。
- 找到 Gemini 并打开其设置。
- 粘贴你的 API key。
- 将 model type 设为
gemini-4-argon。 - 点击 Save,然后在模型选择器的 Gemini 下选中它。
默认的思考强度就够用。我们以 Single Agent 模式、Full access 权限运行,这样它可以直接运行 Blender、写入文件,不必停下来询问。
准备项目文件夹
在 Eigent 中创建一个项目,并指向一个只包含以下两样东西的文件夹:
showcase-kitchen-draught/
PROMPT.md
agent_environment/
input/ # kitchen.blend, subjects.json, action.json, presentation.json, source_overview.png
scripts/ # presentation.py, review.py
其他东西都不要放进去,尤其是评分器、参考运行结果或关于过往结果的笔记。原因见下文。
粘贴提示词
把下面的任务说明复制到 Cowork with 输入框中,原样发送。
Animate the recipe-page mishap
Create a twelve-second cinematic in /app/input/kitchen.blend: a draught lifts a recipe page, carries it across the work area and leaves it draped on the strawberry tartlet identified in /app/input/subjects.json. Preserve the warm illustrated kitchen. Show the calm setup, motivated lift, flight, contact and settling through four connected shots, with visible, consistent wind clues and readable page motion.
## Action and photography
- Scene Sequence runs at 24 fps, frames 1–288, with camera-bound cuts at 1, 73, 145 and 217. Preserve visible source surfaces, material identity and world transforms within 2 mm; keep existing set pieces visible. Add the page, wind clues and staging as needed.
- RecipePage is an editable thin two-sided sheet, 0.13–0.17 m long and 0.09–0.12 m wide, with 100–12,000 native vertices, finite UVs and readable recipe marks.
- Use /app/input/action.json for the start plane and flight corridor. At frame 1, the page is within 10 mm of the start plane and its centroid within 20 mm of the start point. Through frame 48 the centroid stays within 8 mm of its initial pose; by 120 it moves at least 0.10 m. At frames 120, 168 and 192 it follows the corridor within 35 mm.
- Page centroid motion is at most 16 mm per frame, with successive displacement changes at most 5 mm. After best rigid alignment with frame 1, shape deformation is at least 4 mm RMS at one flight frame and 2 mm RMS at rest. Show convincing paper flutter, stiffness and supported contact folds, without penetration or stretched print.
- Throughout frames 241–288, at least 15% of page surface samples are within 8 mm of the actual selected strawberry-tartlet surface. Centroid variation over 264–288 is at most 3 mm; surface motion from 276 to 288 is at most 4 mm.
- Use four distinct cameras. Shot 1 may be orthographic; shots 2–4 use 35–85 mm perspective lenses. Shots 2 and 3 use depth of field focused within 25 mm of the page centroid at each shot's start, midpoint and end.
- At frames 120, 168, 192 and 264, frame the page in front of the active camera within the central 80%, with projected height 8–65% of the image. Within shots, camera motion is at most 25 mm and 4° per frame, with translation changes at most 8 mm; cuts are exempt.
- Compose purposeful shots with coherent screen direction, controlled focus, anticipation and a clear final reveal. Avoid disconnected poses, arbitrary camera moves or unreadable action.
## Handoff
Save sequence.blend, shotlist.csv, storyboard.png and stills/frame_NNN.png for frames 1, 48, 73, 120, 145, 192, 217, 264 and 288 in /app/output. The CSV columns are shot,start,end,camera,action, matching the native four-shot edit. Use labelled 640×480 panels in a 3×3 storyboard. Stills and storyboard match the saved scene under /app/scripts/presentation.py CPU settings with luminance SSIM ≥0.93; use that helper or equivalent images.
Keep the native project editable and below 192 MiB, with finite nondegenerate geometry, all used material/world images packed and no linked libraries. It must replay with Python auto-execution disabled; native constraints and ordinary driver expressions are allowed. Keep /app/input unchanged; use /app/work for work files. Blender Python, headless rendering and command-line tools are available.
这个提示词是为 Docker 容器编写的,所以路径都以 /app 开头。在我们的 Mac 上运行时,Gemini 4 自己把它们映射到了项目文件夹:agent_environment/input、work/ 和 output/。
任务说明里有几个部分起到了关键作用:
- 用数字代替形容词。“拍得有电影感”只是一种氛围。“第 168 帧时距离通道不超过 35 mm”才是智能体可以测量、也能达成的目标。
- 有故事节拍,不只有规则。 平静的开场、有动机的升起、飞行、接触、落定。数字让动作保持真实,节拍让它成为一个故事。
- 保留厨房原貌。 原有对象的偏差不超过 2 mm,材质保持不变。智能体是在场景上添加内容,而不是重建场景。
- 真正可交接的成果。 一个已打包、可编辑的
.blend,在禁用 Python 自动执行的情况下也能回放。明天打开就能接着做动画。
让智能体开始工作
发送提示词。Gemini 4 会先规划任务,然后用 Blender Python 逐步完成。我们这次运行从第一次读取文件到最后的自检,大约用了 50 分钟。下面按顺序看看它做了什么:
- 读取场景。 以无头模式打开
kitchen.blend,加载草莓挞和飞行通道数据,并渲染了起始点的测试视图。 - 搭建布景。 在起始点下方放了一个小木质食谱支架,又在厨房窗户上加了一根窗帘杆。
- 添加风的线索。 一条窗帘系带、几条缎带和支架上的一个小标签,全都朝同一个方向飘动,让穿堂风有一个看得见的来源。
- 制作卡片。
RecipePage尺寸为 0.136 × 0.094 m,有 1,218 个顶点,双面,上面是它自己画的食谱卡:“Recipe No. 14, Strawberry Tartlet”。主厨笔记的最后一行是我们没要求的:“Keep recipe cards away from open kitchen window draughts!” - 规划运动。 一条穿过各个通道检查点的平滑路径,再加上一个贴合草莓挞真实表面的静止搭放形态。
- 布置四台摄像机。 平静开场用 42 mm,升起用 48 mm 加 f/5.6 景深,飞行用 52 mm 跟拍镜头,落地用 58 mm 主镜头。时间轴标记把每台摄像机绑定到第 1、73、145 和 217 帧的剪辑点。
- 检查自己的成果。 它为任务说明中每条可测量的规则编写了验证脚本,运行后修复了发现的问题。卡片印刷的一面朝背离摄像机的方向倾斜,于是它翻转了俯仰角。它还给窗帘加了褶皱,把静止的卡片从相邻的草莓挞旁挪开了一点,并抬高了最后一台摄像机,让结尾的揭示更清晰。
- 交付成果。 它用
presentation.py渲染了静帧和分镜图,写出了shotlist.csv,并做了最终审查:所有原有对象都在,没有移动,材质也都保持原样。
查看镜头表
打开 output/shotlist.csv,四个镜头,每台摄像机一个:
| 镜头 | 帧 | 摄像机 | 动作 |
|---|---|---|---|
| 1 | 1–72 | Cam_Shot1 | 木质食谱支架前的平静开场,窗边的缎带在吹进来的穿堂风中飘动,食谱卡片被吹起 |
| 2 | 73–144 | Cam_Shot2 | 穿堂风带着翻飞的食谱卡片离开支架,升入高处的飞行通道 |
| 3 | 145–216 | Cam_Shot3 | 卡片俯冲掠过厨房操作台,朝双层甜点架滑翔而去 |
| 4 | 217–288 | Cam_Shot4 | 卡片落下,形成一道挺括、有支撑的弧形,搭在草莓挞上 |
然后打开 storyboard.png。九个画面一眼讲完整个故事:卡片静止、升起、穿过厨房,最后落在草莓挞上。
核对数据
Gemini 4 的验证脚本保留在 work/ 中,你随时可以对保存的项目重新运行。以下是它在我们最终的 sequence.blend 上测得的结果:
| 检查项 | 任务说明要求 | 结果 |
|---|---|---|
| 第 1 帧的起始点 | 20 mm 以内 | 1.03 mm |
| 第 48 帧前保持静止 | 漂移不超过 8 mm | 6.69 mm |
| 第 120 帧时的移动距离 | 至少 0.10 m | 0.152 m |
| 第 120、168、192 帧的飞行通道 | 35 mm 以内 | 0.00 mm |
| 卡片速度 | 每帧不超过 16 mm | 9.35 mm |
| 飞行中的抖动 | 至少 4 mm RMS | 11.07 mm |
| 与草莓挞的接触,第 241–288 帧 | 至少占卡片的 15% | 22.9% |
| 卡片穿透草莓挞 | 不允许 | 0 个重叠三角面 |
| 落定,第 264–288 帧 | 不超过 3 mm | 0.37 mm |
| 镜头 2 和 3 的景深对焦 | 距卡片 25 mm 以内 | 0.19 mm 或更小 |
| 摄像机最快转动 | 每帧不超过 4° | 0.71° |
这些是智能体对照任务说明做的自检。任务包里还附带一个独立的评分器:23 条测量规则,加上一个对故事、制作水准和纸张质感打分的视觉评审。如果你想要正式分数,可以在运行结束后,在智能体的文件夹之外自己对输出运行 grader/grade.sh。
播放成片
任务说明要求的是 Blender 项目,而不是视频。所以我们在同一个项目里追加了一条消息,让 Gemini 4 把序列导出为 MP4,并附上一个浏览器预览。
它交回了 sequence.mp4(288 帧,640×480 H.264,3 MB)和 preview.html。预览页面可以播放这段电影短片,实时显示帧号,一键跳转到四个镜头中的任意一个,下方还附有完整的分镜图。
下次我们会换种方式设置
我们的项目文件夹里放了超出智能体所需的东西。除了 PROMPT.md 和 agent_environment/,还有任务的 README.md、grader/,以及之前模型留下的 reference_runs/。
这一点很重要。Gemini 4 的检查脚本用 5% 的拉伸上限来测试卡片上的印刷内容。这个数字并不在提示词里,而是在 README 中,旁边是关于之前几次运行如何失败的笔记。Gemini 4 的脚本从未读取过评分器或参考运行结果,但可以合理推测 README 影响了它设定的目标。
所以请把我们这次运行当作一次展示,而不是基准测试成绩。想要公平测试,就只给智能体两样东西:PROMPT.md 和 agent_environment/,并把评分器放在它看不到的地方。
打造你自己的版本
同样的模式适用于任何 Blender 场景:
- 把审美变成数字。 构图、速度、对焦距离、接触。可测量的目标让智能体在你按下播放键之前就能自我检查。
- 给它一条通道。 JSON 文件里的几个检查点就能引导动作,不需要手动打一个关键帧。
- 要求真正可交接的成果。 一个已打包、可编辑的
.blend、一份镜头表和一张分镜图。你得到的是一个可以继续做下去的项目,而不只是一段渲染结果。 - 让它自己验证。 这次运行最精彩的时刻,是 Gemini 4 发现卡片印刷的一面背对着摄像机,并在我们看到之前就修好了。
十二秒的动画,过去意味着在视口里耗掉一个下午。现在只需要一个提示词,还能得到一个可以打开、调整、变成你自己作品的项目。
致谢:使用 Gemini 4 和 Eigent 制作。场景:Nicole Morena 创作的“Cozy Kitchen”(Blender 3.5 启动画面),CC-BY-SA;衍生场景和渲染图保留署名并遵循 ShareAlike 条款。任务说明和任务数据:Eigent 原创。音乐:The Soundlings 的“Quirk n Twerk”(YouTube 音频库)。



