Community影像github.com

threejs-sky-backdrop

在 Three.js 中以程式生成天空與窗外遠景,無需 HDRI 或圖片檔案。同一組參數同時用於烘焙光照、可見天空球與動態光源,並內含四種預設場景與亮度校驗工具。

threejs-sky-backdrop 是什麼?

這個技能讓 Three.js 開發者能完全以程式碼建立一致的天空與窗外遠景,完全擺脫 HDRI 或外部圖檔的依賴。其核心原則是「天空只描述一次」:同一組參數同時控制烘焙時使用的解析式天空(從地平線到天頂的漸層加上太陽光暈)、可見的天空球(加上雲層、高空薄雲、地平線霧帶與太陽),以及不烘焙時需要的太陽光、半球光與環境貼圖。為了確保室內照明與窗外天空亮度一致,它提供了 `measureDome` 工具來校驗天空球的平均亮度是否維持在解析式天空的 0.85–1.15 倍之間。 遠景部分則實現了高效的室外場景生成,包含從室內窗洞的可見性判斷與 LOD、隨距離淡出的大氣霧化、遠方逐漸變粗的草地網格、碎石小路、樹籬、帶有陶瓦屋頂與窗戶的鄰居房子,以及封住地平線的遠方樹牆。它還可與 `threejs-procedural-vegetation` 整合種植樹木,並支援四種預設(清晨、白天、陰天、黃昏)。所有元件都遵循「只建看得到的東西」原則,透過可見性裁切最佳化效能,在 RTX 4090 上遠景渲染只需 31–34 ms。整個技能適合在任何宣稱支援技能工具的專案中使用,特別是當開發者提到「天空」、「雲」、「程式生成天空」、「不用 HDRI」、「窗外景色」或「遠景」等關鍵詞時。

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

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

在你喜歡的 AI 中提問

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

說明文件

天空與遠景

來源:room-at-dawn(MIT),出自 src/scene/sky.js、src/scene/parts/exterior.js。

核心想法:天空只描述一次。

  • 烘焙器用的是一個解析式的天空:從地平線到天頂的漸層,加上太陽方向的光暈。
  • 看得到的天空球在同一個漸層上加了雲,但要讓平均亮度維持和漸層差不多:雲間的晴空比平均暗,雲邊比較亮,雲心大致相等。
  • 這樣窗外看到的天空,和照進房間的光才會對得上。measureDome 用來量這件事。

檔案

路徑內容
scripts/sky.jsSKIES(dawn、day、overcast、golden)、skyRadiance(和 threejs-baked-gi 的 worker 同一個公式)、bakeCfg、skyDome、SKY_U(uTime)、skyLights、skyEnvironment、measureDome
scripts/backdrop.jswindowVisibility(窗洞可見性與 LOD)、hazePatch(大氣霧化,會保留原本的 shader 補丁)、grassTexture、roofTexture、windowTexture、crownTexture、Soup、houses、lawn、gravelPath、hedge、crownWall
example/二樓的房間(地板高出花園 5.5 m)往窗外看:草地、小路、樹籬、三棟房子、樹、遠方樹牆
example/preview*.jpg四種天空從室內看出去;窗前、仰望天空;外面俯瞰
references/sky.md天空著色器的每一層、預設參數、怎麼調、和烘焙怎麼接
references/backdrop.md可見性判斷、霧化、各遠景元件、效能數據、遇過的問題、搬到其他引擎

範例的樹借用了 threejs-procedural-vegetation(相對路徑 ../../threejs-procedural-vegetation/)。

跑範例

cd <skill 資料夾>/.. && python3 -m http.server 5426 --bind 127.0.0.1
# http://127.0.0.1:5426/threejs-sky-backdrop/example/

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

  • ?sky=dawn|day|overcast|golden:天空預設。
  • ?cam=window|wide|up|out:從房間看出去/窗前/仰望天空/外面俯瞰。
  • ?cull=0:不做可見性裁切,拿來比較。
  • ?t=5:固定時間,雲不會飄。

window.__sky 帶有耗時、三角形數、葉片數,以及天空球對解析式天空的比值。

用法

import { SKIES, skyDome, bakeCfg, skyLights, skyEnvironment, measureDome, SKY_U } from './scripts/sky.js';
const S = SKIES.dawn;
scene.add(skyDome(S));                                       // 有烘焙的室內:display 0.3(預設);戶外:skyDome(S, { display: 1 })
const cfg = { ...bakeCfg(S), portal, room };                 // 交給 threejs-baked-gi 的 runBake
// 不烘焙的場景:
const { sun, hemi } = skyLights(S); scene.add(hemi); if (sun) scene.add(sun, sun.target);
scene.environment = skyEnvironment(renderer, S);
console.log(measureDome(renderer, S));                       // ratio 0.85–1.15
renderer.setAnimationLoop((ms) => { SKY_U.uTime.value = ms / 1000; ... });

一定要遵守

  1. 天空只描述一次:烘焙、天空球、光源都從同一個預設產生。改了天空的顏色,就要重新烘焙。
  2. **調完雲要跑 measureDome。**它會把天空球畫進一張 float cube map,用 cos 加權算出上半球的平均,和解析式天空比較。
    • 比值要在 0.85–1.15 之間,否則窗外的天空會和照進來的光對不上。
    • 加上 { pure: true } 會只畫漸層,結果必須剛好是 1.000,用來確認量測本身沒問題。
  3. 雲的顏色是絕對亮度,和天空同一個單位,不是乘數。我試過改成跟著漸層縮放,清晨的比值掉到 0.73,所以改回原專案的寫法。
  4. 有烘焙的室內,天空球要畫暗一點(display 約 0.3)。曝光是對準室內的,天空照實際亮度畫會變成一片白、失去顏色;這和照明用的亮度無關。
  5. 只建看得到的東西。windowVisibility 從房間裡多個眼睛位置,穿過有厚度的窗洞往外看。
    • 看不到的葉片:交給植物 skill 的 lodAt 回傳 0,只留少量大卡片,讓烘焙時還有樹蔭。
    • 只有斜看才看得到的:回傳 1,變稀疏。
  6. **遠景要加 hazePatch。**距離 10 m 以外,往地平線的顏色淡出,否則遠處的房子和樹會和近景一樣深、一樣飽和,看起來像貼紙。

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

項目數值
天空球 ÷ 解析式天空dawn 0.934、day 1.080、overcast 1.034、golden 1.034;pure 模式 1.000
遠景(草地、路、樹籬、房子、樹牆)31–34 ms
樹(4 棵主樹、8 棵中景、26 棵遠景)生成 0.14–0.16 s,建 mesh 0.31 s
可見性裁切葉片 117,808 → 97,589(−17%),三角形 42.5 萬 → 38.3 萬。省下的主要是貼著外牆、在窗戶兩側的兩棵樹
天空環境貼圖加上兩次量測約 0.09 s

Individual skills in this repo

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

threejs-photoreal-interior

用 three.js 從零做一個照片級的室內場景,完全用程式生成、不需要模型檔、貼圖或 HDRI 的總綱與起手式。內容包括:整體流程(尺寸與座標 → 外殼與窗 → 主角物件 → 材質 → 小物 → 烘焙光照 → 後製 → 驗證 → 電影輸出)、各步驟該用哪個 skill、跨 skill 整合的規則(決定性、細分、材質要經過 GI 補丁且保留原本的 shader 補丁、反照率、太陽直射與烘焙分工、陰影漏光)、一個指令就能建立可執行的新專案(房間、窗、木地板、牆面、桌椅、掛在椅背的毛巾、書架、杯子、水壺、現場烘焙、後製),以及驗收清單和實測數字。當使用者說「做一個寫實的房間/室內」「three.js 照片級場景」「程式生成整個場景」「不用模型做室內」「room-at-dawn 那種」「從哪裡開始做寫實 3D 場景」「開一個新的寫實場景專案」「把這些 skill 串起來」「寫實室內場景流程」時使用;做其中單一環節時,直接用對應的子 skill。

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 畫貼圖」時使用。

相關技能