由一個提示詞到四個鏡頭的 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 音效庫)。



