Community影像github.com

threejs-photoreal-interior

用 three.js 從零製作照片級室內場景,完全程式生成、不需模型檔、貼圖或 HDRI 的總綱與起手式。

threejs-photoreal-interior 是什麼?

這個 skill 提供一個完整的流程與可執行的專案範本,用來從頭建立一個照片級的室內場景,完全使用程式生成,無需外部模型、貼圖或 HDRI 檔案。它整合了多個子 skill,涵蓋從規格定義、尺寸與外殼、主角物件、材質、小物、光照烘焙、後製到驗證輸出的所有步驟。基於 room-at-dawn 專案(MIT 授權),支援在瀏覽器中即時運作,並提供 CLI 腳本快速建立新專案。流程遵循決定性原則(使用 RNG(seed)),所有光照儲存在頂點上,確保烘焙結果可重現,且提供詳細的整合規則(例如材質需經 GI 補丁、太陽光分工、牆芯避免陰影漏光)與驗收清單。適合用於製作程式生成的寫實室內場景,並支援跨 skill 的無縫整合。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ammosu/claude-threejs-photoreal/tree/HEAD/skills/threejs-photoreal-interior

Installed? Explore more 影像 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

在你喜歡的 AI 中提問

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

說明文件

照片級室內場景(總綱)

這個 skill 把下面幾個 skill 串成一套流程,並提供一個可以直接執行的專案範本。 方法來自 room-at-dawn(MIT):一間清晨的臥室,全部用程式產生,跑在瀏覽器裡。原專案的規模大約是:

  • 183 萬個三角形,載入約 7 秒(RTX 4090)。
  • 烘焙的光照檔 gi.bin 約 13 MB,烘一次約 30 分鐘。
  • 影片是 4K HDR10。

各步驟用哪個 skill

步驟skill交付什麼
03d-spec-prompt把想法寫成可驗收的規格:氛圍、時間、尺度、主角物件、鏡頭
1 尺寸與外殼本 skill 的 template/src/layout.js、parts/room.js真實尺寸(公尺)、窗、牆厚、外殼
2 主角物件threejs-procedural-cloth(棉被、毯子、窗簾)、threejs-procedural-vegetation(窗外的樹)、threejs-procedural-pothos(室內植物)視線焦點的物件
2b 天空與窗外threejs-sky-backdrop(天空預設、雲、窗外的草地、房子、遠方樹牆、只建看得到的東西)同一份天空同時給烘焙與畫面
3 材質threejs-procedural-textures牆、地板、木頭、織物、使用痕跡、書封
4 小物threejs-lived-in-props掛在椅背的布、杯子、水壺、襪子、電線、紙團
5 光照threejs-baked-gi天光與太陽反彈光烘焙到頂點,存成 gi.bin;太陽直射用即時光
6 畫面threejs-realtime-postAO、bloom、窗外與室內分開曝光、調色
7 驗證、錄影webgl-deterministic-recording截圖回歸、逐格算繪、電影輸出(景深、動態模糊、HDR10)

開新專案

bash <skill 資料夾>/scripts/new-project.sh ~/git_project/my-room
cd ~/git_project/my-room && python3 -m http.server 5430 --bind 127.0.0.1
# http://127.0.0.1:5430/            已經附上烘焙好的 bake/gi.bin
# http://127.0.0.1:5430/?bake=128   改了場景之後重新烘焙,按「下載 gi.bin」,存到 bake/

(<skill 資料夾> 是載入這個 skill 時顯示的 Base directory;裝成 plugin 時位於 ~/.claude/plugins/cache/ 底下)

  • 這個腳本會把範本複製過去,並把各子 skill 的程式庫複製到 src/lib/(gi、post、props、textures、cloth、vegetation、pothos、sky、film),專案從此獨立運作。
  • 不需要打包工具,也不用 npm。three 和 three-mesh-bvh 從 jsdelivr 載入。
  • URL 參數:
    • ?cam=:鏡頭(room、desk、window、corner、view=站在窗邊往外看)。
    • ?t=:固定時間(樹葉、雲不動,截圖用)。
    • ?view=gi:只看光照。
    • ?only=furniture:只建某個零件。
    • ?exp=:曝光。
  • 頁面提供 window.__ready、window.__stats、window.__camera,可以直接接 webgl-deterministic-recording 的工具。
  • 操作:拖曳轉視角;WASD/方向鍵走動(Shift 慢走,會擋牆和家具);點一下畫面改成滑鼠直接轉頭、視線降到 1.6 m(Esc 離開)。環繞模式的鏡頭和注視點都限制在房間內,拉遠、平移都不會穿出牆。

範本的結構:

檔案內容
src/layout.js唯一放尺寸、太陽、天空(SKIES 預設)、窗外配置(OUTSIDE)、調色、鏡頭、不能穿過的家具範圍(BLOCKERS)的地方
src/materials.jslit()(GI 補丁,保留原本的 shader 補丁,記錄反照率)、solid()、tbox()、tplane()、metres()
src/scene.js依 order 建立每個零件,順序固定
src/parts/room.js地板、天花板、四面牆、窗洞與窗台、黑色外殼、牆芯
src/parts/outside.js窗外:天空球、草地、碎石路、樹籬、房子、遠方樹牆、主樹與中遠景樹(只建看得到的,threejs-sky-backdrop + threejs-procedural-vegetation)。全部 gi = false、不擋烘焙光
src/parts/furniture.js桌子、椅子、掛在椅背的毛巾(PBD)、杯子、水壺、桌上的書、書架上的書
src/main.js建立場景 → 烘焙、讀檔或平光 → 太陽 → 反射 → 後製 → 鏡頭(環繞+走動,限制在房間內)

跨 skill 一定要遵守

  1. **單位是公尺,座標固定。**X 沿窗牆、Z 往室內(窗牆在 z = 0,z < 0 是室外)、Y 往上。所有尺寸只寫在 layout.js。
  2. **決定性。**亂數一律用 RNG(seed)。零件的順序、名稱、頂點數,只要有一項變了,那個 mesh 的烘焙就會失效;applyBake 會回報 stale。
  3. **光存在頂點上,所以要細分。**有東西放在上面的表面切到 1.5–2 cm,大面積 4–8 cm。用 tbox/tplane。
  4. 所有被照亮的材質都要經過 lit()。giPatch 會直接取代 onBeforeCompile,lit() 會把原本的補丁串在後面,包括牆面變化(wallPatch)、布料逆光、風吹。 有貼圖的材質要給 albedo(貼圖的 avg),反彈光的顏色才會正確。
  5. **太陽的分工:**直射光用 DirectionalLight(強度等於烘焙設定的 sun.irr),反彈光烘進檔案。不要再加環境光或半球光。
  6. **牆要有實心的牆芯,牆芯的 shadowSide 設成 FrontSide。**少了它,太陽會在牆腳和牆角漏出一排亮點(實際遇過;詳見 references/integration.md)。
  7. **曝光對準室內。**室內大約只有室外的 1/20:exposure 約 4.5,窗外用 ext 約 0.3 壓暗。
  8. 反射在烘焙之後拍。captureEnv 要在 applyBake/runBake 之後執行,探針放在房間中央。
  9. **有窗外遠景時,鏡頭 far 要大於最遠的東西。**範本是 400 m(樹牆在 100 m、草地延伸到 260 m)。far 只有 100 時,遠景被切掉的那一圈會露出白色的地平線霧帶,而且跟著視角移動(實際遇過)。
  10. 太陽的陰影相機要涵蓋窗外的樹冠,樹蔭才會落進來:範本把太陽放在 30 m 外,near 12、far 40。

實測(範本,RTX 4090、Chrome headless、1280×800)

  • 建立場景 1.2 秒,其中毛巾的垂掛約 0.65 秒;10.7 萬個三角形;從開頁到出畫面約 1.6 秒。
  • 現場烘焙 128 spp:61,407 個取樣點、26 個 worker,6 秒,gi.bin 743 KB。重新載入後套用 39 個網格,0 個失效。
  • preview.jpg:房間、桌邊、窗、只看光。preview-bake.jpg:左邊是平光,右邊是烘焙後。

進一步

  • references/workflow.md:每個步驟的做法、要做的決定、交付物和檢查點。
  • references/integration.md:各 skill 之間的介面、要注意的地方、遇過的問題。
  • references/checklist.md:驗收清單,以及數字的參考範圍。

Individual skills in this repo

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

threejs-procedural-cloth

用程式「設計」出照片級的靜態布料(不做物理模擬):沒鋪好的棉被、毯子、桌巾、垂下床緣或桌緣的布、翻起一角的被子、布上放東西,以及掛在桿子上的窗簾(吊環夾出的折、往下鬆開與散開、綁起下擺、車線與雙層縫邊、亞麻平織)。方法是平面高度場(團塊+有方向的長折+削峰+逐條畫上的皺褶)→ 包到支撐物上 → 高的折往一側倒 → 翻角 → 依 3D 曲面攤平 UV → 細皺紋 normal map+凹處變暗,含可重用程式庫、分階段範例、驗證數據,以及搬到 Godot/Unreal 的做法。當使用者說「程式生成布料」「棉被/床單/毯子/桌巾建模」「布料皺褶」「布垂下床邊」「被子翻一角」「布料不要用模擬」「cloth without simulation」「procedural cloth」「布上的花紋被拉長」「布料看起來像塑膠/像山」「窗簾建模」「程式生成窗簾」「窗簾皺褶」「curtain」「布簾」時使用。

threejs-procedural-textures

在 three.js 用程式即時生成照片級材質貼圖(不用任何圖檔):可無縫重複的雜訊、以公釐為單位的高度場轉 normal map、粗糙度與 AO 打包、Canvas2D 轉貼圖、平均反照率(給光照烘焙用)、接縫檢查。內含現成的材質:滾筒漆木屑壁紙加上大尺度的灰泥與漆色變化、烤漆橘皮紋、手摸過的粗糙度、積灰、橡木地板(交錯接縫、每片紋理不同、節疤、四邊微倒角)、通用木紋、對拼橡木貼皮、平織、鬆餅格、毛巾布、羅紋、針織、毛氈、棉繩、使用痕跡(灰塵、油脂、指紋、碎屑、棉絮、頭髮、杯印、細刮痕,同時畫進顏色與粗糙度)、斑點釉、粉體塗裝刮傷、書封圖集與對應 UV 的書本幾何、書頁邊、地形圖海報、照片、假文字。當使用者說「程式生成貼圖」「procedural texture」「不用圖檔的材質」「normal map 怎麼產生」「木地板/木紋貼圖」「牆面看起來太假」「布料材質」「針織/毛巾布 normal map」「使用痕跡」「刮痕/指紋/灰塵」「粗糙度貼圖」「書封/書背」「假文字」「貼圖有接縫」「Canvas 畫貼圖」時使用。

threejs-sky-backdrop

在 three.js 用程式做天空與窗外遠景,不需要 HDRI 或圖檔。天空的同一份參數同時用在三個地方:烘焙光照用的解析式天空、看得到的天空球(雲層、高空薄雲、地平線霧帶、太陽),以及不烘焙時用的太陽光、半球光與環境貼圖。內含四種預設(清晨、白天、陰天、黃昏)和一個量測工具,確認看到的天空和照亮場景的天空亮度一致。遠景部分包括:只建從室內窗戶看得到的東西(窗洞可見性與 LOD)、隨距離變淡的大氣霧化、遠處逐漸變粗的草地網格、碎石小路、樹籬、鄰居房子(陶瓦屋頂、窗戶、煙囪、天窗)、封住地平線的遠方樹牆,並可以搭配 threejs-procedural-vegetation 種樹。當使用者說「天空」「sky shader」「雲」「程式生成天空」「不用 HDRI」「窗外景色」「遠景」「背景房子」「地平線」「大氣透視」「霧化」「窗外的樹」「天空和光照對不上」「清晨/黃昏/陰天的天空」「只建看得到的東西」時使用。

相關技能