CommunityImagemgithub.com

threejs-sky-backdrop

Gera céu e fundo de janela proceduralmente em three.js, sem HDRI ou arquivos de imagem. Os mesmos parâmetros do céu são usados em três lugares: céu analítico para iluminação horneada, esfera celeste visível e luzes/ambiente para cenas não horneadas. Inclui quatro presets (amanhecer, dia, nublado, entardecer) e uma ferramenta de medição.

O que é threejs-sky-backdrop?

Este skill permite criar um céu procedural e um fundo de janela em three.js sem depender de imagens HDRI ou texturas externas. A ideia central é que o céu seja descrito uma única vez, com os mesmos parâmetros sendo usados simultaneamente para: (1) o céu analítico usado pelo baker de iluminação horneada, (2) a esfera celeste visível (com nuvens, névoa, sol), e (3) as luzes solar e hemisférica e o mapa de ambiente para cenas que não usam horneamento. Isso garante que a luz que entra pela janela corresponda exatamente ao que se vê lá fora. Para verificar essa correspondência, o skill inclui a função `measureDome`, que compara a luminância média da esfera celeste com a do céu analítico e exige que a razão fique entre 0.85 e 1.15. O componente de fundo (`backdrop.js`) constrói apenas os elementos visíveis de uma janela interna: grama, caminho de cascalho, sebes, casas vizinhas (telhados de cerâmica, janelas, chaminés, claraboias) e uma parede de árvores no horizonte. Ele usa um sistema de visibilidade que descarta o que não é visto através da abertura da janela, otimizando o desempenho com LOD e culling. O skill é compatível com `threejs-procedural-vegetation` para adicionar árvores e com `threejs-baked-gi` para iluminação horneada. A névoa atmosférica (`hazePatch`) é aplicada para suavizar a transição de cores com a distância, evitando que objetos distantes pareçam recortes. O exemplo incluso mostra um quarto no segundo andar com vista para o jardim, suportando os presets de céu e diferentes ângulos de câmera. O skill é útil para arquitetura, visualização de interiores, jogos e qualquer cena 3D que precise de um céu realista e coerente com a iluminação, sem depender de assets externos pesados.

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

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Céu e Fundo de Janela

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

Ideia central: o céu é descrito apenas uma vez.

  • O baker usa um céu analítico: um gradiente do horizonte ao zênite, com um halo na direção do sol.
  • A esfera celeste visível adiciona nuvens sobre o mesmo gradiente, mas a luminância média deve permanecer próxima à do gradiente: o céu limpo entre nuvens é mais escuro que a média, as bordas das nuvens são mais claras, e o centro das nuvens é aproximadamente igual.
  • Assim, o céu visto pela janela corresponde à luz que ilumina o interior. measureDome é usado para verificar isso.

Arquivos

CaminhoConteúdo
scripts/sky.jsSKIES (amanhecer, dia, nublado, entardecer), skyRadiance (mesma fórmula do worker do threejs-baked-gi), bakeCfg, skyDome, SKY_U (uTime), skyLights, skyEnvironment, measureDome
scripts/backdrop.jswindowVisibility (visibilidade da abertura da janela e LOD), hazePatch (névoa atmosférica, preserva patches originais do shader), grassTexture, roofTexture, windowTexture, crownTexture, Soup, houses, lawn, gravelPath, hedge, crownWall
example/Quarto no segundo andar (piso 5.5 m acima do jardim) com vista para: gramado, caminho, sebes, três casas, árvores, parede de árvores ao fundo
example/preview*.jpgQuatro tipos de céu vistos de dentro; da janela, olhando para cima; vista externa
references/sky.mdCada camada do shader do céu, parâmetros padrão, como ajustar, como conectar com o baker
references/backdrop.mdLógica de visibilidade, névoa, cada elemento do fundo, dados de desempenho, problemas encontrados, portabilidade para outros engines

As árvores do exemplo usam threejs-procedural-vegetation (caminho relativo ../../threejs-procedural-vegetation/).

Executar o Exemplo

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

(<pasta do skill> é o diretório base exibido ao carregar este skill; quando instalado como plugin, fica em ~/.claude/plugins/cache/)

  • ?sky=dawn|day|overcast|golden: Preset do céu.
  • ?cam=window|wide|up|out: Do quarto olhando para fora / da janela / olhando para cima / vista externa.
  • ?cull=0: Desativa corte de visibilidade (para comparação).
  • ?t=5: Tempo fixo, nuvens não se movem.

window.__sky contém tempo de processamento, número de triângulos, número de folhas e a razão da esfera celeste com o céu analítico.

Uso

import { SKIES, skyDome, bakeCfg, skyLights, skyEnvironment, measureDome, SKY_U } from './scripts/sky.js';
const S = SKIES.dawn;
scene.add(skyDome(S));                                       // Com baker: display 0.3 (padrão); externo: skyDome(S, { display: 1 })
const cfg = { ...bakeCfg(S), portal, room };                 // Passar para runBake do threejs-baked-gi
// Cena sem baker:
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; ... });

Regras Obrigatórias

  1. O céu é descrito apenas uma vez: baker, esfera celeste e luzes são gerados a partir do mesmo preset. Se alterar a cor do céu, precisa re-hornear.
  2. Após ajustar nuvens, execute measureDome. Ela renderiza a esfera celeste em um float cube map, calcula a média ponderada por cosseno do hemisfério superior e compara com o céu analítico.
    • A razão deve estar entre 0.85 e 1.15; caso contrário, o céu visto não corresponderá à luz que ilumina o interior.
    • Com { pure: true }, desenha apenas o gradiente; o resultado deve ser exatamente 1.000, confirmando que a medição está correta.
  3. A cor das nuvens é luminância absoluta, na mesma unidade do céu, não um multiplicador. Testei escalonar com o gradiente, e a razão do amanhecer caiu para 0.73; por isso voltei à implementação original.
  4. Em interiores horneados, a esfera celeste deve ser desenhada mais escura (display ~0.3). A exposição é ajustada para o interior; desenhar o céu com brilho real resultaria em área branca e sem cor – isso não afeta a luminância usada para iluminação.
  5. Construa apenas o que é visível. windowVisibility usa múltiplas posições de olho dentro do quarto, projetando através da abertura da janela com espessura.
    • Folhas não visíveis: retorna 0 no lodAt do skill de vegetação, mantendo apenas alguns cartões grandes para que a sombra ainda exista no baker.
    • Folhas visíveis apenas obliquamente: retorna 1, tornando-se mais esparsas.
  6. Adicione hazePatch ao fundo. Para distâncias acima de 10 m, desbota em direção à cor do horizonte; caso contrário, casas e árvores distantes parecerão tão escuras e saturadas quanto as próximas, como adesivos.

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

ItemValor
Esfera celeste ÷ Céu analíticoamanhecer 0.934, dia 1.080, nublado 1.034, entardecer 1.034; modo pure 1.000
Fundo (grama, caminho, sebes, casas, parede de árvores)31–34 ms
Árvores (4 principais, 8 de médio alcance, 26 distantes)geração 0.14–0.16 s, malha 0.31 s
Corte de visibilidadeFolhas 117.808 → 97.589 (−17%), triângulos 425k → 383k. A economia principal vem de duas árvores rentes à parede externa, ao lado da janela
Mapa de ambiente do céu + duas medições~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 畫貼圖」時使用。

Habilidades Relacionadas