Claude 的 Blender 電影製作
這是一個 10 秒夜間 FPV 無人機飛越城市鏡頭的工作流程:一個故事板、真實的物理路徑、一個轉折點(第一個英雄沒成功)、夜間照明、從動作生成的音效、3.5 小時的渲染,以及一個黏土堆疊揭示。以下每一步都是 scripts/ 中為該鏡頭實際執行的腳本;其中的名稱(Drone Empty、Street Asphalt、Building_1...)來自該場景——請根據你的場景重新命名。
0. 設定
- Blender 4.4+(使用 5.2 製作)、用於 Cycles 的 GPU、PATH 上的 Python 3 +
ffmpeg(音效步驟需要額外安裝numpy、scipy)。 - 即時橋接(Claude 控制開啟的 Blender,你觀看):在 Blender 的文字編輯器中執行
tools/bridge.py(監聽 127.0.0.1:9876)。然後在終端機中:python tools/send.py scripts/06_night.py或python tools/send.py -c "print(bpy.data.filepath)"。 - 將
FILM_ROOT設定為你的專案資料夾(預設為~/blender-film):scene/、render/、audio/、research/位於該處。tools/lib.py會由每個腳本載入(輔助函數:coll()、save()、snap()...)。 - 在副本上工作。 在重播或重新執行任何編輯材質的腳本之前,請複製 .blend 檔案——如果執行到一半當機,數個步驟是不可重複執行的(一旦出現孤立的節點連結,再次執行會出問題)。
1. 先做故事板
在觸碰 Blender 之前,要求 Claude 提供一個 10 秒的故事板:包含時間點的鏡頭列表、每個鏡頭的攝影機、英雄的位置、觀眾的感受。將其轉換成一張圖像工作表(使用任何圖像模型),並保持開啟——之後的每個決定都要與其進行比對。
2. 城市
使用你擁有的城市資產包(建築物、道路、道具)或免費的 CC0 資產(Poly Haven)。讓 Claude 從俯瞰地圖沿 +X 方向佈置一條大道和一個交叉路口(保持英雄的路徑暢通無阻),然後進行點綴:汽車(停放的/移動的/停止的)、路燈、樹木、消防栓。將每個外部資產烘焙到 .blend 檔案中。
3. 物理驅動的運動,非手動關鍵幀曲線
scripts/01_swing_sim.py 模擬運動(重力、空氣阻力、不可拉伸的繩索、根據故事板設置的網路錨點),並搜尋錨點時機,直到路徑穿過街道。02_path_empty.py 將其轉換為路徑曲線 + 一個帶有「跟隨路徑」約束的空物體,其偏移量按幀關鍵化(真實速度,非線性)。英雄作為空物體的子級,攝影機跟隨自己的路徑(03_camera.py,以及用於細微晃動的 03b_camera_noise.py)。
4. 英雄——以及何時轉向
第一個英雄是一個帶有 Mixamo 動作剪輯動畫的綁定蜘蛛人。它失敗了:動作捕捉是在地面上錄製的,所以在空中它像個木偶一樣懸掛,姿勢僵硬,而且在畫面中顯得很小。如果帶有四肢的角色看起來不對勁,就更換英雄——保留城市、攝影機和路徑。 向 Claude 詢問選項(我們得到了:老鷹、超級跑車、手動修復、FPV 無人機)。
FPV 無人機之所以有效,是因為沒有任何東西會看起來僵硬。04_drone_attitude.py 讓它像真正的四軸飛行器一樣飛行:
- 物理姿態:推力軸 = 加速度 + 重力,機頭指向速度方向 -> 它會在加速時傾斜、在快速轉彎時劇烈傾斜、在煞車時機頭向上拉起;
- 在路徑為彈道軌跡處收油門 -> 在上方疊加自由式技巧:動力翻轉、桶滾、後空翻;
- 煞車拉起進入懸停,然後緩慢旋轉直視鏡頭;旋轉的槳葉 + 青色/洋紅色 LED 燈條。
5. 寫實處理(05_realism.py)
那些沒人注意的小細節,直到缺少時才被發現:AgX 曝光(無調色)、薄霧體積、帶有破損紋理重複的瀝青、車輪路徑、每條車道上的油滴線、修補補丁、磨損的標線,以及每個牆腳的灰塵 + 微弱的徑流痕跡。
6. 真正像夜晚的夜間照明(06_night.py)
法則:夜晚,天空不照亮場景——實際光源才照亮場景。 帶有城市光芒的暗色漸變天空、LED 路燈、亮燈的窗戶、汽車頭燈/尾燈、紅色交通信號燈、帶有輕微自發光的藍色調霧氣、帶有積水的濕漉瀝青。
- 第一次嘗試失敗了(到處都是橙色霧氣,發光的方塊而不是窗戶)。
- 修正方法:立面紋理已經知道玻璃的位置——玻璃是光滑的,牆壁是粗糙的。使用粗糙度貼圖作為窗戶遮罩(
roughness < 0.3),然後為每個窗格單元格隨機打光:暖色、冷色、關閉。
7. 像真實操作員的攝影機(07_shakify_cams.py)
將程序化噪聲替換為 Shakify(免費附加元件,包含真實錄製的攝影機運動),應用於每個鏡頭的攝影機。添加近距離鏡頭:一個街道層級的攝影機,位於潮濕道路上方約 0.45 米處,無人機俯衝向鏡頭,並剛好在鏡頭前停下。08_lens_look.py:燈光周圍的輝光、輕微的桶狀變形和色散——無調色,外觀即光源。
8. 從動作設計音效
免費 CC0 錄音(BigSoundBank:DJI 無人機、夜晚的城市、濕路交通、喇叭聲、遠處的警報聲、風聲、雨打在水坑上的聲音、空調聲)。11_motion_data.py 讀取每一幀的動畫(無人機距離/徑向速度/側向/油門、附近的汽車)到 audio/motion.json 中;12_build_sfx.py 根據它來驅動混音:
- 油門 -> 馬達 RPM -> 音高;徑向速度 -> 都卜勒效應(當它經過鏡頭時音高下降);側向 -> 等功率聲像;
- 距離增益 + 空氣吸收、油門急推時的螺旋槳洗流爆發、在潮濕道路上低空懸停時的噴水聲、僅在屋頂鏡頭出現的屋頂空調聲、汽車在最接近點經過的聲音、街道峽谷混響;
- 製作兩個版本(寧靜的夜晚 / 完整的城市混亂)並根據聽感選擇。寧靜版本勝出:讓英雄成為焦點。響度 -14 LUFS。
9. 安全地徹夜渲染
09_render_opt.py:移除隱藏的重複幾何體(樹木資產攜帶了額外的副本),對距離所有鏡頭攝影機都很遠的任何物體使用較輕的 LOD、GPU 降噪。視覺上無變化。- 首先以最終品質渲染 六張測試靜幀 並檢查它們。
10_render_edit.py僅渲染剪輯使用的幀(鏡頭列表 = 攝影機 + 幀範圍),可恢復,並寫入render/status.json;tools/render_window.ps1(Windows)顯示清晰的進度面板:百分比、剩餘時間、最後完成的幀。- 渲染完成後:檢查每個幀是否存在、沒有黑色/損壞的幀(每幀亮度,僅在計劃的剪輯點處有跳躍)、音效符合批准的混音、響度符合 YouTube 標準。只有這樣才進行編碼 +(如果你要求的話)關閉電腦。
10. 白色黏土堆疊揭示(證明是真實的 3D)
13_aerial_cam.py 在大道上方添加一個高角度攝影機。在場景的全新副本上,14_clay_build.py 將所有東西變成白色黏土,將攝影機 + 交通凍結在一幀,並隱藏每個部件直到其輪到,然後讓它從天空掉落:首先是汽車,然後是離攝影機最近的建築物,然後是遠方的城市,最後是路燈和消防栓(約 500 個部件)。每個部件都會加速下落,並在著陸時輕微反彈。tools/clay_assemble.sh:夜間 | 硬切 | 黏土堆疊 | 一個 0.25 秒的划像 | 夜間,相同攝影機,相同幀。黏土與夜間的分割靜幀可以製作很好的縮圖。
耗費時間的教訓
- 如果視窗規格不正確,螢幕錄影機會捕捉到黑色畫面——在離開前檢查錄製的第一個幀。
- 視埠錄製:材質預覽需要關閉動態模糊或取消體積連結,否則會產生模糊;Cycles 視埠需要降噪器。
- 在
blender -b中的相對輸出路徑會解析到驅動器根目錄——始終使用絕對路徑。 - 在任何長時間的 GPU 任務前先詢問;先以低品質測試,最後再使用最終品質。
許可證:MIT。僅由 Abdullah Formuli 維護。不接受外部貢獻。