Community画像github.com

threejs-sky-backdrop

three.js でプログラム的に空と窓外の遠景を生成します。HDRIや画像ファイルは不要です。

threejs-sky-backdrop とは?

このスキルは、three.js を使用してプログラム的に空と窓外の遠景を生成するためのものです。HDRI や画像ファイルを必要とせず、コードベースで空の外観と環境照明を完全に制御できます。主な特徴として、ベイク用の解析的空、視覚的な空球(雲、薄雲、地平線霧、太陽)、およびリアルタイム照明用の太陽光・半球光・環境マップが、同一のパラメータから生成されるため、窓から見える空と室内を照らす光の明るさが常に一致します。4 つのプリセット(夜明け、昼、曇り、夕方)と、視覚的な空と照明用の空の明るさが一致しているかを確認する測定ツールが用意されています。遠景には、窓から見えるものだけを構築する可視性カリングと LOD、距離に応じてフェードする大気フォグ、遠くで粗くなる草地、砂利道、生け垣、隣家(瓦屋根、窓、煙突、天窓)、地平線を塞ぐ遠くの樹壁が含まれ、`threejs-procedural-vegetation` と組み合わせて木を配置することも可能です。ユーザーが「空」「スカイシェーダー」「雲」「プログラム生成空」「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に質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

空と遠景

出典: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 のワーカーと同じ式)、bakeCfg、skyDome、SKY_U(uTime)、skyLights、skyEnvironment、measureDome
scripts/backdrop.jswindowVisibility(窓の開口部の可視性と LOD)、hazePatch(大気フォグ、元のシェーダーパッチを保持)、grassTexture、roofTexture、windowTexture、crownTexture、Soup、houses、lawn、gravelPath、hedge、crownWall
example/2階の部屋(床が庭から 5.5 m 高い)から窓の外を見る:芝生、小道、生垣、3棟の家、木々、遠くの樹壁
example/preview*.jpg4種類の空を室内から見た様子;窓の前、空を見上げる;外から見下ろす
references/sky.md空のシェーダーの各層、デフォルトパラメータ、調整方法、ベイクとの連携方法
references/backdrop.md可視性判定、フォグ、各遠景コンポーネント、パフォーマンスデータ、遭遇した問題、他のエンジンへの移植

サンプルの木は threejs-procedural-vegetation(相対パス ../../threejs-procedural-vegetation/)を借用しています。

サンプルの実行

cd <スキルフォルダ>/.. && python3 -m http.server 5426 --bind 127.0.0.1
# http://127.0.0.1:5426/threejs-sky-backdrop/example/

(<スキルフォルダ> はこのスキル読み込み時に表示される Base directory;プラグインとしてインストールした場合は ~/.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 は、部屋内の複数の目の位置から、厚みのある窓の開口部を通して外を見る。
    • 見えない葉:植物スキルの 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 秒、メッシュ構築 0.31 秒
可視性カリング葉 117,808 → 97,589(−17%)、三角形 42.5 万 → 38.3 万。削減の大部分は外壁に沿って窓の両側にある 2 本の木による
空の環境マップと 2 回の測定約 0.09 秒

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

関連スキル