Community이미지github.com

threejs-sky-backdrop

Three.js에서 코드로 하늘과 창밖 원경을 생성하며, HDRI나 이미지 파일이 필요 없습니다. 하늘의 동일한 파라미터가 베이킹 조명, 보이는 하늘, 조명의 세 곳에 일관되게 적용됩니다.

threejs-sky-backdrop란 무엇인가요?

이 스킬은 Three.js 기반 3D 씬에서 절차적(procedural) 하늘과 창밖 배경(backdrop)을 생성하는 도구입니다. 핵심 아이디어는 하늘 파라미터를 한 번만 정의하면, 이를 베이킹 조명(baked GI)을 위한 해석적 하늘(analytic sky), 사용자가 실제로 보는 하늘 돔(sky dome, 구름 포함), 그리고 실시간 조명(태양광, 반구광, 환경 맵) 세 곳에 동일하게 적용하여 일관성을 유지한다는 점입니다. 네 가지 프리셋(새벽, 낮, 흐림, 황혼)을 제공하며, `measureDome` 유틸리티로 하늘 돔과 해석적 하늘의 평균 밝기 비율을 측정하여 0.85~1.15 사이를 유지하도록 보장합니다. 원경(backdrop) 부분은 창문 개구부를 통해서만 보이는 요소(건물, 나무, 잔디 등)를 LOD와 가시성 컬링으로 효율적으로 렌더링하며, 대기 원근법을 위한 `hazePatch`로 먼 거리의 색상을 흐리게 처리합니다. 이 스킬은 `threejs-baked-gi`, `threejs-procedural-vegetation`과 함께 사용하도록 설계되었으며, 사용자가 "하늘", "sky shader", "구름", "절차적 하늘", "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.

핵심 아이디어: 하늘은 한 번만 정의한다.

  • 베이킹(baking)에서는 해석적 하늘(analytic sky)을 사용합니다: 지평선에서 천정까지의 그라데이션과 태양 방향의 광채(glow)로 구성됩니다.
  • 보이는 하늘 돔(sky dome)은 동일한 그라데이션 위에 구름을 추가하지만, 평균 밝기가 그라데이션과 거의 같도록 합니다: 구름 사이의 맑은 하늘은 평균보다 어둡고, 구름 가장자리는 더 밝으며, 구름 중심은 거의 같습니다.
  • 이렇게 하면 창밖에서 보이는 하늘이 방 안으로 들어오는 빛과 일치합니다. 이를 확인하기 위해 measureDome을 사용합니다.

파일

경로내용
scripts/sky.jsSKIES (dawn, day, overcast, golden), skyRadiance (threejs-baked-gi의 worker와 동일한 공식), 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.5m 높음)에서 창밖을 바라보는 예시: 잔디, 길, 산울타리, 세 채의 집, 나무, 먼 나무 벽
example/preview*.jpg네 가지 하늘 프리셋을 실내에서 본 모습; 창가, 하늘을 올려다봄, 외부 조감
references/sky.md하늘 셰이더의 각 레이어, 기본 파라미터, 조정 방법, 베이킹과의 연동 방법
references/backdrop.md가시성 판단, 안개, 각 원경 요소, 성능 데이터, 발생한 문제, 다른 엔진으로의 이식 방법

예시의 나무는 threejs-procedural-vegetation(상대 경로 ../../threejs-procedural-vegetation/)을 사용했습니다.

예시 실행

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

(<skill 폴더>는 이 스킬을 로드할 때 표시되는 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. 구름의 색상은 절대 밝기(absolute luminance) 이며, 하늘과 동일한 단위이고 배수가 아닙니다. 그라데이션에 맞춰 스케일링하도록 변경해 본 결과, 새벽 프리셋에서 비율이 0.73으로 떨어져서 원래 프로젝트 코드로 되돌렸습니다.
  4. 베이킹된 실내에서는 하늘 돔을 더 어둡게 렌더링합니다 (display 약 0.3). 노출이 실내에 맞춰져 있기 때문에, 하늘을 실제 밝기로 그리면 화면이 하얗게 날아가서 색상을 잃습니다. 이는 조명용 밝기와는 무관합니다.
  5. 보이는 것만 렌더링합니다. windowVisibility는 방 안의 여러 눈 위치에서 두께가 있는 창문 개구부를 통해 바깥을 봅니다.
    • 보이지 않는 잎사귀: 식물 스킬의 lodAt이 0을 반환하여 소량의 큰 카드만 남기고, 베이킹 시 나무 그늘이 생기도록 합니다.
    • 비스듬히 볼 때만 보이는 것: 1을 반환하여 더 드물게 렌더링합니다.
  6. 원경에는 hazePatch를 적용해야 합니다. 10m 이상 거리에서는 지평선 방향으로 색상이 희미해집니다. 그렇지 않으면 먼 집과 나무가 가까운 것과 동일한 깊이와 채도로 보여 스티커처럼 보입니다.

실측 (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 s, 메시 구축 0.31 s
가시성 컬링잎사귀 117,808 → 97,589 (−17%), 삼각형 42.5만 → 38.3만. 주로 외벽에 붙어 창문 양쪽에 있는 두 그루의 나무에서 절감됨
하늘 환경 맵 + 두 번의 측정약 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 畫貼圖」時使用。

관련 스킬