Communitygithub.com

murathany7/scene-3d

使用 Three.js 建立影片的即時 3D 鏡頭,或透過 Blender 預先渲染生成 3D 鏡頭,支援卡通、擬真與霓虹風格。

scene-3d 是什麼?

此技能讓 AI 代理程式能夠為影片製作 3D 鏡頭,提供兩種互補的引擎:Three.js 用於即時圖層,Blender 用於高品質預渲染 (plate)。對於 Three.js,它透過 `/engines/three.js` 的 `threeLayer` 函式提供生命週期鉤子,並匯入 THREE.js 模型、管理動畫混合器 (AnimationMixer)、實現基於 GSAP 的攝影機動畫,以及像是 `looks/toon-3d`、`looks/photoreal` (ACES 色調映射、環境反射) 和 `looks/neon-noir` (發光材質與泛光後處理) 等外觀。Blender 部分則提供可編寫的場景腳本 (scene script) 與渲染腳本,支援 EEVEE、CYCLES 或 WORKBENCH 引擎,並內建口型同步工具。兩種引擎都強調確定性:Three.js 透過時間參數化更新與固定時間步長物理模擬 (1/120 秒) 來實現,並建議透過 MD5 檢查碼進行渲染驗證。該技能在編輯階段將 3D 圖層與 HTML/CSS 圖層、影片 plate 流暢整合,是製作動態圖形、產品展示、角色動畫與風格化視覺效果的理想選擇。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/murathany7/reel-studio/tree/HEAD/.agents/skills/scene-3d

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

預覽

來自技能 README

說明文件

3D 鏡頭

Three.js (即時圖層)

  • 從 /engines/three.js 使用 threeLayer(el, { update(t), background, fov })。為 three 新增 import map (參見 examples/engines-demo/index.html)。
  • update(t) 根據 t 設定所有變換。攝影機動畫:在一般物件上使用 GSAP 補間動畫來設定關鍵幀 (tl.to(cam, { x: 4, z: 8, duration: 2 }, 3)),並在 update 中將值複製到 camera.position。
  • 模型:從 three/addons/loaders/GLTFLoader.js 使用 GLTFLoader (在 import map 中添加 "three/addons/": "/core/node_modules/three/examples/jsm/")。將載入動作包裹在 Studio.wait(...) 中。 將模型檔案放在品牌的 assets/models/ 或製作物件的 composition/ 目錄下。
  • 外觀 (looks/README.md) 決定渲染風格;同一個模型可以採用以下任一種方式:
    • 卡通 (looks/toon-3d):toon(color, { steps }) + outline(mesh, { thickness })。硬光:一個 DirectionalLight + 低強度的 AmbientLight。
    • 擬真 (looks/photoreal):await realistic(renderer, scene) (包裹在 Studio.wait 中:ACES 色調映射、一個用於反射的室內環境、柔和的陰影) + pbr(color, { metalness, roughness, clearcoat })。一個帶有 castShadow 的主光、一個從後方來的冷色背光、一個放在 CSS 漸層上的 ShadowMaterial 地板。保持攝影機高於掠射角度 (光澤面會變白),緩慢移動,最終使用 Studio.setup({ motionBlur: true }) 渲染。
    • 霓虹 (looks/neon-noir):emissive(color, intensity) + threeLayer(el, { post: bloom({ strength, threshold }) }), scene.fog。保持 threshold ≥ 0.2 且 emissive ≤ 2,否則所有物體都會泛光成白色。
  • 動畫 GLB 片段:建立一個 AnimationMixer,然後在 update 中呼叫 mixer.setTime(t - start)。永遠不要使用 mixer.update(delta)。
  • 跟隨 3D 點的 HTML 標籤:在 update(t) 中,先呼叫 camera.updateMatrixWorld() 及其父物件的 updateMatrixWorld(),再執行 vector.applyMatrix4(obj.matrixWorld).project(camera)。Three.js 只會在 render() 內部更新這些矩陣,所以如果沒有呼叫,標籤會停留在上一幀的位置。範例:productions/bike-logger/REEL-002-engines。
  • 作為 JSON (頂點 + 索引) 的 CAD 網格:使用 toNonIndexed() + computeVertexNormals() 可產生清晰的平面形面。 使用 threeLayer(..., { pixelRatio: 2 }) 渲染以獲得超採樣邊緣。
  • 物理:預先烘焙 (在第一幀之前以固定的 1/120 秒步長模擬到一個陣列中),然後根據 t 進行查詢。
  • 說話角色:使用經典的 <script> 標籤載入 /engines/lipsync.js 以及台詞的 .visemes.js (由 scripts/lipsync.sh 產生), 然後在 update(t) 中:LipSync.paramsAt(cues, t, "mouth", { offset }) → { open, wide, round } (0…1) 應用到變形目標 (mesh.morphTargetInfluences) 或嘴巴網格的縮放。參見 engines/README.md, Lip sync 章節。

Blender (預渲染背景)

  • 場景腳本定義 build(ctx);複製 engines/blender/example_scene.py。ctx 提供 toon(rgb)、 key(obj, "location", t, value)、size、fps、duration、frames、scene。
  • 渲染:engines/blender/render.sh scene.py composition/plates/<name>.mp4 --size 1080x1920 --duration 4 [--engine EEVEE|CYCLES|WORKBENCH]。 草稿使用 --size 540x960,最終渲染使用完整尺寸。
  • 背景顏色:僅對攝影機顯示 (使用光線路徑 "Is Camera Ray" 混合,如同範例所示),否則它會照亮場景並使卡通色帶扁平化。
  • 色彩管理設定為 Standard,以便品牌十六進制顏色按輸入值顯示。對於擬真背景,請在 build 中切換為 ctx["scene"].view_settings.view_transform = "AgX",使用 --engine CYCLES 渲染,並使用區域光 和攝影機景深。
  • 物理與模擬:在渲染前於場景腳本中預先烘焙。
  • 說話角色:在場景腳本中 import lipsync as L (run.py 會將 engines/blender/ 和腳本本身的 資料夾加入路徑),cues = L.load("productions/…/audio/vo.visemes.json"),然後 L.key_shape_keys(head, cues, ctx, offset=VO_START) 在每一幀上對形狀鍵 open、wide、round 設定關鍵幀 (使用 names={"open": "Jaw"} 對應其他名稱)。其他情況:每幀使用 ctx["key"] 呼叫 L.params_at(cues, t, offset=…)。
  • 在合成中:<video src="plates/<name>.mp4"> + Studio.video(el, { start })。背景沒有 Alpha 通道;將 文字和角色放在上層的 HTML 圖層中。

檢查

將關鍵畫格渲染為靜態圖像並仔細檢查。對於 Three.js,將同一幀渲染兩次並比較 MD5 值。將渲染時間記錄在製作日誌中。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能