CommunityImagegithub.com

threejs-sky-backdrop

Créez un ciel et un arrière-plan extérieur dans three.js par programmation, sans HDRI ni fichiers image. Une seule description du ciel est utilisée pour la cuisson de l'éclairage, la sphère visible (nuages, cirrus, brume d'horizon, soleil) et les lumières/environnement. Comprend quatre préréglages (aube, jour, couvert, crépuscule) et un outil de mesure.

Qu'est-ce que threejs-sky-backdrop ?

Ce skill "threejs-sky-backdrop" permet de générer un ciel procédural et un arrière-plan extérieur (vue à travers une fenêtre) dans three.js, sans recourir à des HDRI ou images externes. L'idée centrale est de décrire le ciel une seule fois : la même configuration (dégradé d'horizon à zénith, position du soleil) est utilisée à la fois pour la cuisson de l'éclairage (via un ciel analytique pour le baking GI), pour la sphère de ciel visible (avec nuages, cirrus et brume) et pour les sources lumineuses (soleil, hémisphère, environnement). Le système garantit que la luminosité moyenne du ciel visible correspond à celle du ciel analytique, avec un outil `measureDome` pour vérifier un ratio compris entre 0.85 et 1.15. L'arrière-plan extérieur comprend des éléments tels que des fenêtres avec visibilité adaptée, de l'herbe texturée, un chemin de gravier, des haies, des maisons (toits en tuiles, fenêtres, cheminées) et un mur d'arbres lointain. Un brouillard atmosphérique (`hazePatch`) est ajouté pour estomper les couleurs des objets éloignés. Le skill est compatible avec `threejs-procedural-vegetation` pour ajouter des arbres, et il est conçu pour fonctionner avec `threejs-baked-gi` pour la cuisson de l'éclairage. Les commandes usuelles lorsqu'un utilisateur mentionne "ciel", "sky shader", "nuages", "ciel procédural", "sans HDRI", "vue extérieure", "arrière-plan de fenêtre", "horizon", "brume atmosphérique" ou "aube/crépuscule" déclenchent ce skill.

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

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Ciel et arrière-plan extérieur

Source : room-at-dawn (MIT), extrait de src/scene/sky.js, src/scene/parts/exterior.js.

Idée centrale : décrire le ciel une seule fois.

  • Le cuiseur utilise un ciel analytique : un dégradé de l'horizon au zénith, avec un halo autour de la direction du soleil.
  • La sphère de ciel visible ajoute des nuages sur ce même dégradé, mais pour que la luminosité moyenne reste proche de celle du dégradé : l'azur entre les nuages est plus sombre que la moyenne, les bords des nuages sont plus clairs, et le centre des nuages a une luminosité équivalente.
  • Ainsi, le ciel visible à travers la fenêtre correspond à la lumière qui éclaire la pièce. measureDome permet de vérifier cette correspondance.

Fichiers

CheminContenu
scripts/sky.jsSKIES (dawn, day, overcast, golden), skyRadiance (même formule que le worker de threejs-baked-gi), bakeCfg, skyDome, SKY_U (uTime), skyLights, skyEnvironment, measureDome
scripts/backdrop.jswindowVisibility (visibilité de l'ouverture de la fenêtre et LOD), hazePatch (brume atmosphérique, conserve le correctif shader d'origine), grassTexture, roofTexture, windowTexture, crownTexture, Soup, houses, lawn, gravelPath, hedge, crownWall
example/Une pièce au deuxième étage (plancher à 5,5 m au-dessus du jardin) vue depuis la fenêtre : pelouse, chemin, haies, trois maisons, arbres, mur d'arbres lointain
example/preview*.jpgLes quatre types de ciel vus de l'intérieur ; devant la fenêtre, en regardant le ciel ; vue extérieure depuis le dessus
references/sky.mdChaque couche du shader de ciel, paramètres par défaut, réglages, raccordement avec la cuisson
references/backdrop.mdLogique de visibilité, brume, composants de l'arrière-plan, performances, problèmes rencontrés, portage vers d'autres moteurs

Les arbres de l'exemple utilisent threejs-procedural-vegetation (chemin relatif ../../threejs-procedural-vegetation/).

Exécution de l'exemple

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

(<dossier du skill> est le répertoire de base affiché lors du chargement de ce skill ; installé en tant que plugin, il se trouve sous ~/.claude/plugins/cache/)

  • ?sky=dawn|day|overcast|golden : préréglage de ciel.
  • ?cam=window|wide|up|out : vue depuis la pièce / devant la fenêtre / en regardant le ciel / vue extérieure du dessus.
  • ?cull=0 : désactive le clipping de visibilité, à des fins de comparaison.
  • ?t=5 : fige le temps (les nuages ne bougent pas).

window.__sky contient le temps d'exécution, le nombre de triangles, le nombre de feuilles, ainsi que le rapport de la sphère de ciel au ciel analytique.

Utilisation

import { SKIES, skyDome, bakeCfg, skyLights, skyEnvironment, measureDome, SKY_U } from './scripts/sky.js';
const S = SKIES.dawn;
scene.add(skyDome(S));                                       // Intérieur avec cuisson : display 0.3 (par défaut) ; extérieur : skyDome(S, { display: 1 })
const cfg = { ...bakeCfg(S), portal, room };                 // À passer à runBake de threejs-baked-gi
// Scène sans cuisson :
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; ... });

Règles impératives

  1. Décrire le ciel une seule fois : le cuiseur, la sphère de ciel et les lumières sont tous issus du même préréglage. Si vous modifiez la couleur du ciel, vous devez relancer la cuisson.
  2. Après avoir ajusté les nuages, exécutez measureDome. Il dessine la sphère de ciel dans une cube map flottante, calcule la moyenne de l'hémisphère supérieure pondérée par cos, et la compare au ciel analytique.
    • Le ratio doit être compris entre 0.85 et 1.15, sinon le ciel vu depuis la fenêtre ne correspondra pas à la lumière qui éclaire la pièce.
    • Ajoutez { pure: true } pour ne dessiner que le dégradé : le résultat doit être exactement 1,000, ce qui permet de vérifier que la mesure elle-même est correcte.
  3. La couleur des nuages est une luminosité absolue, dans la même unité que le ciel, pas un facteur multiplicatif. J'ai essayé de la faire suivre le dégradé, mais le ratio tombait à 0,73 à l'aube, j'ai donc rétabli l'écriture d'origine.
  4. Dans un intérieur avec cuisson, la sphère de ciel doit être plus sombre (display environ 0.3). L'exposition est calibrée pour l'intérieur ; si le ciel était affiché avec sa luminosité réelle, il serait aveuglant et perdrait toute couleur, sans rapport avec la luminosité utile pour l'éclairage.
  5. Ne construisez que ce qui est visible. windowVisibility calcule, depuis plusieurs positions d'yeux dans la pièce, ce qui est visible à travers l'ouverture de la fenêtre (avec épaisseur de mur).
    • Feuilles non visibles : renvoyez 0 via lodAt du skill de végétation, ne laissez que quelques grandes cartes pour que la cuisson conserve les ombres des arbres.
    • Feuilles visibles uniquement en vision oblique : renvoyez 1 pour les rendre plus clairsemées.
  6. Ajoutez hazePatch à l'arrière-plan. Au-delà de 10 m, les couleurs se fondent vers la couleur de l'horizon ; sinon, les maisons et arbres lointains auraient la même intensité et saturation que les objets proches, donnant un effet d'autocollant.

Mesures (RTX 4090, Chrome headless, 1280×800)

ÉlémentValeur
Sphère de ciel ÷ ciel analytiqueaube 0,934 ; jour 1,080 ; couvert 1,034 ; doré 1,034 ; mode pur 1,000
Arrière-plan (pelouse, chemin, haies, maisons, mur d'arbres)31–34 ms
Arbres (4 arbres principaux, 8 intermédiaires, 26 lointains)génération 0,14–0,16 s, construction du maillage 0,31 s
Clipping de visibilitéFeuilles : 117 808 → 97 589 (−17 %) ; triangles : 425 000 → 383 000. L'économie provient principalement de deux arbres collés au mur extérieur, de part et d'autre de la fenêtre
Texture d'environnement du ciel avec deux mesuresEnviron 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 畫貼圖」時使用。

Skills associés