CommunityImagengithub.com

threejs-sky-backdrop

Genera cielos procesales y fondos de ventana en three.js, sin necesidad de HDRI ni archivos de imagen. Un solo conjunto de parámetros alimenta el cielo utilizado para horneado de iluminación, el cielo visible y las luces.

¿Qué es threejs-sky-backdrop?

Este skill de three.js permite crear escenas con cielos y fondos exteriores completamente generados por código, eliminando la dependencia de HDRIs o texturas externas. La clave de su diseño es que un único conjunto de parámetros de cielo se utiliza de forma coherente en tres contextos: el cielo analítico para el horneado de iluminación (usado por el skill `threejs-baked-gi`), el cielo visible (con nubes, neblina y sol) y las fuentes de luz (sol, hemisferio y mapa de entorno) cuando no se usa horneado. Incluye cuatro presets (amanecer, día, nublado, atardecer) y una herramienta de medición (`measureDome`) para garantizar que el brillo del cielo visible coincida con el del cielo analítico, evitando discrepancias de iluminación. Para el fondo exterior, el skill construye solo los elementos visibles desde la ventana de una habitación, utilizando recorte de visibilidad, LOD, niebla atmosférica, y varios componentes como césped, un camino de grava, setos, casas vecinas y un muro de árboles. Funciona con Node.js y se puede usar tanto en entornos con horneado como sin él, y se integra con el skill `threejs-procedural-vegetation` para añadir árboles.

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

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Cielo y fondo exterior

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

Idea central: describir el cielo una sola vez.

  • El horneador utiliza un cielo analítico: un degradado desde el horizonte hasta el cenit, más un halo en la dirección del sol.
  • La esfera celeste visible añade nubes sobre el mismo degradado, pero la luminosidad media debe mantenerse aproximadamente igual que la del degradado: el cielo despejado entre nubes es más oscuro que el promedio, los bordes de las nubes son más brillantes, y el centro de las nubes es aproximadamente igual.
  • De esta manera, el cielo visto desde la ventana y la luz que ilumina la habitación coinciden. measureDome se utiliza para medir esta relación.

Archivos

RutaContenido
scripts/sky.jsSKIES (dawn, day, overcast, golden), skyRadiance (misma fórmula que el worker de threejs-baked-gi), bakeCfg, skyDome, SKY_U (uTime), skyLights, skyEnvironment, measureDome
scripts/backdrop.jswindowVisibility (visibilidad de la abertura de la ventana y LOD), hazePatch (niebla atmosférica, conserva el parche shader original), grassTexture, roofTexture, windowTexture, crownTexture, Soup, houses, lawn, gravelPath, hedge, crownWall
example/Habitación en el segundo piso (suelo a 5.5 m sobre el jardín) con vista a la ventana: césped, camino, setos, tres casas, árboles, muro de árboles lejano
example/preview*.jpgCuatro tipos de cielo vistos desde el interior; frente a la ventana, mirando al cielo; vista exterior desde arriba
references/sky.mdCada capa del shader de cielo, parámetros predeterminados, cómo ajustarlos, cómo se conecta con el horneado
references/backdrop.mdLógica de visibilidad, niebla, componentes del fondo, datos de rendimiento, problemas encontrados, portabilidad a otros motores

Los árboles del ejemplo usan threejs-procedural-vegetation (ruta relativa ../../threejs-procedural-vegetation/).

Ejecutar el ejemplo

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

(<carpeta del skill> es el directorio base que se muestra al cargar este skill; cuando se instala como plugin, está en ~/.claude/plugins/cache/)

  • ?sky=dawn|day|overcast|golden: preset de cielo.
  • ?cam=window|wide|up|out: desde la habitación / frente a la ventana / mirando al cielo / vista exterior.
  • ?cull=0: sin recorte de visibilidad, para comparar.
  • ?t=5: tiempo fijo, las nubes no se mueven.

window.__sky contiene el tiempo de ejecución, número de triángulos, número de hojas y la relación entre la esfera celeste y el cielo analítico.

Uso

import { SKIES, skyDome, bakeCfg, skyLights, skyEnvironment, measureDome, SKY_U } from './scripts/sky.js';
const S = SKIES.dawn;
scene.add(skyDome(S));                                       // Interiores con horneado: display 0.3 (predeterminado); exteriores: skyDome(S, { display: 1 })
const cfg = { ...bakeCfg(S), portal, room };                 // Pasar a runBake de threejs-baked-gi
// Escenas sin horneado:
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; ... });

Reglas imprescindibles

  1. Describir el cielo una sola vez: el horneado, la esfera celeste y las luces se generan a partir del mismo preset. Si se cambia el color del cielo, hay que volver a hornear.
  2. Después de ajustar las nubes, ejecutar measureDome. Dibuja la esfera celeste en un cube map flotante, calcula el promedio del hemisferio superior ponderado por cos y lo compara con el cielo analítico.
    • La relación debe estar entre 0.85 y 1.15; de lo contrario, el cielo visto desde la ventana no coincidirá con la luz que entra.
    • Con la opción { pure: true } se dibuja solo el degradado, y el resultado debe ser exactamente 1.000, para confirmar que la medición es correcta.
  3. El color de las nubes es brillo absoluto, en la misma unidad que el cielo, no un multiplicador. Intenté escalarlo con el degradado, pero la relación al amanecer bajó a 0.73, así que volví a la implementación original.
  4. En interiores con horneado, la esfera celeste debe dibujarse más oscura (display alrededor de 0.3). La exposición está ajustada para el interior; dibujar el cielo con su brillo real lo dejaría completamente blanco y sin color; esto no afecta el brillo utilizado para la iluminación.
  5. Construir solo lo que es visible. windowVisibility proyecta rayos desde múltiples posiciones de los ojos en la habitación a través de la abertura de la ventana con espesor.
    • Hojas no visibles: el skill de vegetación devuelve 0 en lodAt, dejando solo unas pocas tarjetas grandes para que aún haya sombra durante el horneado.
    • Solo visibles al mirar de reojo: devuelve 1 y se vuelven más dispersas.
  6. Agregar hazePatch al fondo. A más de 10 m de distancia, los colores se desvanecen hacia el horizonte; de lo contrario, las casas y árboles lejanos se verían tan oscuros y saturados como los primeros planos, pareciendo pegatinas.

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

ElementoValor
Esfera celeste ÷ cielo analíticodawn 0.934, day 1.080, overcast 1.034, golden 1.034; modo pure 1.000
Fondo (césped, camino, setos, casas, muro de árboles)31–34 ms
Árboles (4 principales, 8 de medio plano, 26 lejanos)Generación 0.14–0.16 s, construcción de malla 0.31 s
Recorte de visibilidadHojas 117,808 → 97,589 (-17%), triángulos 425k → 383k. El ahorro proviene principalmente de dos árboles pegados a la pared exterior, a los lados de la ventana
Mapa de entorno celeste + dos medicionesAprox. 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 relacionados