懶人包
- Threads 上「一份 PDF 丟進 Claude Opus 5.5,出來一段橘色吐司機在時間軸上跳的影片」,抽格看是 Blender 3D 渲染:景深、動態模糊、斜放的 After Effects 介面平板,不是網頁動畫錄下來的。
- 轉貼的 aistart_up 在留言補充,原作者也說要另外裝 Blender 和現成程式庫,不是丟一份文件就結束。PDF 是分鏡規格,Claude 寫的是 Blender Python 腳本。
- 我照這個思路重做一次:分鏡 PDF 1 頁、Blender 腳本 275 行,Blender 4.5.15 在 RTX 4070 上渲染 192 格花 72 秒,輸出 8 秒 1280×720 的 MP4。
- 關鍵寫法是「每一格的位置 = 函式(f)」,逐格打 keyframe。改一個參數重跑就是新版本,可以進 git。
- 第一輪預覽抓到兩個問題:角色被 AgX 色彩洗成粉色、追拍鏡頭沒跟到跳躍高度。先渲 8 張半解析度預覽再全片渲染,能省掉重渲的時間。
Threads 帳號 aistart_up 轉了一支影片:一份 PDF 丟進 Claude Opus 5.5,出來一個橘色方塊角色在 After Effects 時間軸上跳來跳去,最後跳進合成視窗,亮起「MADE WITH CLAUDE」。貼文寫「不會動畫軟體也想做產品小動畫的,可以看這個」。
我把原片抽格看過,再自己從頭做一次。結論先講:這支影片是 Blender 渲染的,Claude 做的事是把分鏡翻譯成 Blender 腳本。 會不會動畫軟體不重要,但電腦上要有 Blender。
這是我做出來的成品,8 秒 720p,可以在 展示頁 直接播放:
影片版(YouTube Shorts)
〈丟 PDF 給 Claude 就做出 3D 動畫?其實是它寫了 Blender 程式〉
〈這隻麻糬的 3D 動畫,是 Claude 寫 372 行程式算出來的〉
這支「PDF 生影片」是怎麼做的?
先看原片的線索。Threads 貼文的影片轉自 X 帳號 @0xwhrrari,原串樓下附了 PDF 的雲端連結。我抽格後看到這些特徵:
| 原片畫面 | 代表什麼 |
|---|---|
| AE 介面是一塊斜放的平板,鏡頭從上方俯衝到低角度 | 有 3D 場景和攝影機,不是 2D 畫面平移 |
| 前景清楚、背景糊,糊的程度隨鏡頭改變 | 攝影機景深,f 值有打關鍵影格 |
| 角色跳躍時有拖影 | 渲染器的動態模糊 |
| playhead 和霓虹字會在周圍打出光暈 | 後製 bloom(發光) |
所以這條路的分工是:
PDF 不是魔法咒語。它的價值是把「我要什麼畫面」寫成可以逐條對照的規格,模型照表施工、人照表驗收。原作者的 PDF 我沒有拿到,下面用的是我自己寫的版本。
分鏡 PDF 要寫什麼?
我寫的分鏡只有 1 頁,分四段:場景、角色、鏡頭表、渲染設定。
寫的時候有三件事最影響結果:
- 時間寫成秒數區間。 「0–1.1 秒俯瞰、1.1–4.7 秒追拍」可以直接換算成第幾格,模型不用猜節奏。
- 動作寫物理描述,不寫形容詞。 「起跳前蓄力壓扁、空中拉長、落地欠阻尼彈簧回彈(ζ≈0.35)」比「跳得很可愛」好實作,也好驗收。
- 渲染設定寫死。 引擎、色彩管理、動態模糊、bloom 都列出來,模型就不會自己挑一個看起來平的預設值。
Blender 腳本怎麼寫?
腳本是 Claude Code(Opus 5.5)照分鏡寫的,275 行 Python,只用 Blender 內建的 bpy,沒有裝外掛。結構照分鏡順序排:
| 區段 | 做的事 |
|---|---|
| 場景 | 16 公尺寬的 UI 平板,貼上用 Playwright 截好的假 AE 介面;深咖啡色桌面 |
| 角色 | 用圓角方塊組出身體、眼睛、手、四隻腳,掛在同一個空物件底下 |
| playhead | 一根發光的細長方塊,X 座標每格跟角色同步 |
| 動作 | 每一格算出角色位置、轉向、縮放,打 keyframe |
| 攝影機 | 三拍:廣角俯衝、低角度追拍、拉到合成視窗的 hero 角度;焦距和 f 值一起打 keyframe |
| 渲染 | EEVEE、動態模糊、AgX Punchy 色彩、compositor 的 Fog Glow |
def spring(u, zeta=0.35, w=18):
"""Under-damped settle 1 -> 0 used for landing squash."""
return math.exp(-zeta * w * u) * math.cos(w * math.sqrt(1 - zeta ** 2) * u)
主迴圈逐格把角色、playhead、攝影機算出來再打 keyframe:
for f in range(1, N + 1):
loc, rz, sc = clawd_at(f)
rig.location, rig.rotation_euler, rig.scale = loc, (0, 0, rz), sc
for prop in ("location", "rotation_euler", "scale"):
rig.keyframe_insert(prop, frame=f)
ph.location.x = knob.location.x = loc.x
ph.keyframe_insert("location", frame=f)
這樣寫的好處是可以重現。想讓角色跳高一點,改 HOP_H 陣列一個數字重跑;想換節奏,改落地格數 land。不用打開 Blender 介面拖曲線,整支動畫就是一個 Python 檔,可以 diff、可以進版本控制。
怎麼跑起來?
我用的是 Blender 4.5.15 LTS 的 portable 版(Windows zip 解壓即用,不用安裝),加上 Python 的 Playwright 和 ffmpeg。
# 1. 把假 AE 介面和標題卡截成貼圖,順便記下合成視窗座標到 layout.json
python src/make_textures.py tex
# 2. Blender 背景模式執行腳本,-- 後面的參數會原樣傳給 Python 的 sys.argv
blender.exe -b --factory-startup -P src/scene.py -- C:/abs/path/tex C:/abs/path/frames
# 3. 192 張 PNG 合成 MP4
ffmpeg -framerate 24 -i frames/f_%04d.png -c:v libx264 -crf 28 -pix_fmt yuv420p out/clawd-timeline.mp4
參數意思我用 blender --help 對過:-b 是不開介面的背景模式,-P 執行指定的 Python 檔,--factory-startup 不讀使用者自己的 startup.blend,-- 之後的參數 Blender 不處理、直接交給 sys.argv。腳本裡用 sys.argv[sys.argv.index("--") + 1:] 拿到貼圖和輸出資料夾。
腳本還有一個 --preview 參數,只渲染 8 張半解析度的關鍵格。實際數字:
| 項目 | 結果 |
|---|---|
| 全片渲染 | 192 格,01:09:32 到 01:10:44,共 72 秒(RTX 4070) |
| 輸出 | 1280×720、24fps、8.000 秒,703 KB |
| ffprobe | width=1280 height=720 nb_frames=192 duration=8.000000 |
預覽抓到哪些問題?
第一輪預覽抓到兩個問題,都是看圖才發現的,腳本本身沒有報錯:
- 角色變成粉色。 分鏡寫的是 Claude 橘,但材質顏色加上自發光,經過 AgX 色彩管理之後畫面偏粉。改法是重調材質顏色和自發光強度,看預覽圖確認落回橘色。
- 追拍時角色跑到畫面頂端。 攝影機原本瞄準地面上的角色位置,角色一跳就出框。改成瞄準角色 70% 的跳躍高度,鏡頭會微微跟上去,又不會晃得太厲害。
這個做法適合誰?
適合:
- 想做產品或品牌的短動畫,畫面需要景深、光影這類 3D 質感。
- 能接受在電腦上裝 Blender、跑指令。不用會操作 Blender 介面,但要看得懂預覽圖哪裡不對,並把問題講清楚。
- 想把動畫放進版本控制,之後換文案、換顏色重渲。
- 想完全不裝軟體、一句話拿影片。這條路一定要有 Blender 和本機算力,我這次 72 秒是在 RTX 4070 上跑的,沒有獨立顯示卡會慢很多(我沒有實測 CPU 渲染的時間)。
- 需要角色骨架動畫、布料、毛髮這種複雜效果。這次的角色是方塊拼成的,動作靠縮放和位移就夠;有手有腳的角色要做骨架綁定,腳本會複雜很多。
如果你想先試門檻更低的 2D 版本,Claude 寫 p5.js 做動畫 那篇只需要 Node.js、Chrome 和 ffmpeg;要做文字與數據型的動態片頭,可以看 Mosaic Motion 實測。