CommunityBildgithub.com

threejs-sky-backdrop – Himmel und Außenansicht

Erzeuge prozeduralen Himmel und Außenansichten für three.js – ohne HDRI oder Bilddateien. Dieselben Himmelsparameter steuern gleichzeitig den Bake-Himmel, die Himmelskugel (Wolken, Dunst, Sonne) und – falls nicht gebacken wird – Sonnenlicht, Hemisphärenlicht und Umgebungsmap. Enthält vier Presets (Morgen, Tag, bedeckt, Goldene Stunde) und ein Messwerkzeug, um die Übereinstimmung von sichtbarem Himmel und beleuchtendem Himmel zu prüfen.

Was ist threejs-sky-backdrop – Himmel und Außenansicht?

Dieses Skill für AI Agenten (Claude Code, Cursor, Codex, Copilot) bietet eine vollständige, programmatische Himmels- und Außenansicht für three.js-Szenen, die ohne HDRI oder Bilddateien auskommt. Es stammt aus dem Projekt room-at-dawn und umfasst zwei Kernkomponenten: `sky.js` definiert Himmelszustände (dawn, day, overcast, golden), eine analytische Himmelsstrahlung (identisch zur Formel im threejs-baked-gi-Worker), die drehbare Himmelskugel mit Wolken und Dunst, sowie Lichtquellen und Umgebungsmaps für Szenen ohne Baking. Die Himmelskugel erhält die gleiche mittlere Helligkeit wie die analytische Version – gemessen mit `measureDome`, das die Himmelskugel in eine Float-Cube-Map rendert und den cos-gewichteten Mittelwert über die obere Halbkugel mit dem analytischen Himmel vergleicht (Toleranz ±15 %). `backdrop.js` konstruiert eine Außenansicht, die nur daszeigt, was von einem Innenraum durch ein Fenster sichtbar ist: Fensterloch-Sichtbarkeit mit LOD, atmosphärischer Dunst, Gras- und Kiesweg-Texturen, Hecken, Nachbarhäuser (Dachziegel, Fenster, Schornsteine, Dachluken) und eine abschließende Baumwand am Horizont. Es lässt sich mit dem Skill threejs-procedural-vegetation kombinieren, um prozedurale Bäume zu platzieren. Die Sichtbarkeitsoptimierung (windowVisibility) reduziert die Polygonanzahl drastisch, indem sie von mehreren Augenpositionen im Raum durch das Fensterloch testet: unsichtbare Blätter werden auf wenige große Karten reduziert (für Baumschatten beim Baking), schräg sichtbare werden ausgedünnt. Der Dunst (hazePatch) sorgt dafür, dass Objekte ab 10 m Entfernung farblich zum Horizont verblassen – sonst wirken entfernte Häuser und Bäume flach und unnatürlich. Das Beispiel (zweistöckiger Raum, 5,5 m über dem Garten) zeigt den vollen Workflow: vier Himmelszustände, verschiedene Kameraperspektiven (window, wide, up, out) und optionale Sichtbarkeitsabschaltung (`?cull=0`). Performance-Messungen auf einer RTX 4090 zeigen 31–34 ms für die Außenansicht, 0,14 s für die Baumgenerierung und eine Einsparung von 17 % der Blätter durch Culling. Das Skill eignet sich besonders für Architekturvisualisierung, Spiele und virtuelle Umgebungen, die einen konsistenten, beleuchtungsgenauen Himmel und realistische Außenblicke benötigen.

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

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Himmel und Außenansicht

Quelle: room-at-dawn (MIT), aus src/scene/sky.js, src/scene/parts/exterior.js.

Kernidee: Den Himmel nur einmal beschreiben.

  • Der Baker verwendet einen analytischen Himmel: einen Farbverlauf vom Horizont bis zum Zenit, plus einen Lichthof um die Sonnenrichtung.
  • Die sichtbare Himmelskugel fügt auf denselben Farbverlauf Wolken hinzu, wobei die durchschnittliche Helligkeit möglichst nah am Farbverlauf bleibt: Der wolkenfreie Himmel ist dunkler als der Durchschnitt, Wolkenränder sind heller, das Wolkenzentrum etwa gleich hell.
  • So stimmt der aus dem Fenster sichtbare Himmel mit dem Licht überein, das in den Raum fällt. measureDome dient zur Überprüfung.

Dateien

PfadInhalt
scripts/sky.jsSKIES (dawn, day, overcast, golden), skyRadiance (gleiche Formel wie im Worker von threejs-baked-gi), bakeCfg, skyDome, SKY_U (uTime), skyLights, skyEnvironment, measureDome
scripts/backdrop.jswindowVisibility (Fensterloch-Sichtbarkeit und LOD), hazePatch (atmosphärischer Dunst – behält den ursprünglichen Shader-Patch bei), grassTexture, roofTexture, windowTexture, crownTexture, Soup, houses, lawn, gravelPath, hedge, crownWall
example/Raum im zweiten Stock (Boden 5,5 m über dem Garten) mit Blick aus dem Fenster: Rasen, Weg, Hecke, drei Häuser, Bäume, abschließende Baumwand
example/preview*.jpgVier Himmelszustände von innen; vor dem Fenster, Blick nach oben; von außen herunter
references/sky.mdJede Schicht des Himmels-Shaders, Standardparameter, Anpassung, Verbindung zum Baking
references/backdrop.mdSichtbarkeitslogik, Dunst, Außenkomponenten, Performance-Daten, aufgetretene Probleme, Portierung auf andere Engines

Die Bäume im Beispiel stammen aus threejs-procedural-vegetation (relativer Pfad ../../threejs-procedural-vegetation/).

Beispiel ausführen

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

(<skill-ordner> ist das Base directory, das beim Laden dieses Skills angezeigt wird; als Plugin liegt es unter ~/.claude/plugins/cache/)

  • ?sky=dawn|day|overcast|golden: Himmelsvoreinstellung.
  • ?cam=window|wide|up|out: Aus dem Raum / vor dem Fenster / Blick nach oben / von außen herunter.
  • ?cull=0: Keine Sichtbarkeitsoptimierung – zum Vergleich.
  • ?t=5: Fixierte Zeit, Wolken bewegen sich nicht.

window.__sky enthält Zeitaufwand, Dreieckanzahl, Blattanzahl und das Verhältnis der Himmelskugel zum analytischen Himmel.

Verwendung

import { SKIES, skyDome, bakeCfg, skyLights, skyEnvironment, measureDome, SKY_U } from './scripts/sky.js';
const S = SKIES.dawn;
scene.add(skyDome(S));                                       // Mit Baking im Innenraum: display 0.3 (Standard); draußen: skyDome(S, { display: 1 })
const cfg = { ...bakeCfg(S), portal, room };                 // An threejs-baked-gi/runBake übergeben
// Szenen ohne Baking:
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; ... });

Wichtige Regeln

  1. Den Himmel nur einmal beschreiben: Baking, Himmelskugel und Lichtquellen werden aus derselben Voreinstellung erzeugt. Wird die Himmelsfarbe geändert, muss neu gebackt werden.
  2. Nach dem Anpassen der Wolken measureDome ausführen. Es rendert die Himmelskugel in eine Float-Cube-Map, berechnet den cos-gewichteten Mittelwert über die obere Halbkugel und vergleicht ihn mit dem analytischen Himmel.
    • Das Verhältnis muss zwischen 0,85 und 1,15 liegen – sonst stimmt der Himmel im Fenster nicht mit dem einfallenden Licht überein.
    • Mit { pure: true } wird nur der Farbverlauf gezeichnet; das Ergebnis muss exakt 1,000 sein – das bestätigt, dass die Messung selbst korrekt ist.
  3. Die Wolkenfarbe ist absolute Helligkeit in derselben Einheit wie der Himmel, kein Multiplikator. Ich habe getestet, sie stattdessen mit dem Farbverlauf zu skalieren; das Verhältnis fiel bei „Morgen“ auf 0,73, daher wurde die Schreibweise des Originalprojekts wiederhergestellt.
  4. In Innenräumen mit Baking muss die Himmelskugel dunkler gezeichnet werden (display etwa 0.3). Die Belichtung ist auf den Innenraum abgestimmt; würde die Himmelskugel mit tatsächlicher Helligkeit gezeichnet, erschiene sie überbelichtet und farblos – unabhängig von der für die Beleuchtung verwendeten Helligkeit.
  5. Nur das Sichtbare bauen. windowVisibility testet von mehreren Augenpositionen im Raum durch ein dickes Fensterloch.
    • Unsichtbare Blätter: Erhalten vom Pflanzen-Skill lodAt den Wert 0; es bleiben nur wenige große Karten, damit beim Baking noch Baumschatten entstehen.
    • Nur schräg sichtbare Blätter: Erhalten 1, werden ausgedünnt.
  6. Zur Außenansicht hazePatch hinzufügen. Ab 10 m Entfernung verblasst die Farbe in Richtung Horizont. Sonst wirken entfernte Häuser und Bäume genauso tief und gesättigt wie nahe Objekte – sie sehen dann aus wie aufgeklebt.

Gemessene Werte (RTX 4090, Chrome headless, 1280×800)

MerkmalWert
Himmelskugel ÷ analytischer Himmeldawn 0.934, day 1.080, overcast 1.034, golden 1.034; pure-Modus 1.000
Außenansicht (Rasen, Weg, Hecke, Häuser, Baumwand)31–34 ms
Bäume (4 Hauptbäume, 8 mittlere, 26 ferne)Generierung 0.14–0.16 s, Mesh-Aufbau 0.31 s
SichtbarkeitsoptimierungBlätter 117.808 → 97.589 (−17 %), Dreiecke 425.000 → 383.000. Die Einsparung kommt hauptsächlich von zwei Bäumen direkt an der Außenwand seitlich der Fenster
Himmels-Umgebungsmap plus zwei Messungenca. 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 畫貼圖」時使用。

Verwandte Skills