CommunityBildgithub.com

threejs-prozedurale-texturen

In three.js fotorealistische Texturen zur Laufzeit prozedural generieren – ohne eine einzige Bilddatei. Enthält nahtloses Rauschen, Höhenfelder in Millimetern, Normal Maps, Roughness/AO-Packing, Canvas-2D-Texturen, Durchschnittsfarben (für Light Baking) und Nahtprüfung.

Was ist threejs-prozedurale-texturen?

Dieses Skill für KI-gestützte 3D-Entwicklung (kompatibel mit Claude Code, Cursor, Codex und ähnlichen Agenten) ermöglicht die vollständig prozedurale Generierung fotorealistischer Texturen in three.js – ohne externe Bilddateien. Der Kern basiert auf physikalischen Einheiten: Höhen werden in Millimetern definiert, UVs in Metern, und Rauschfunktionen haben ganzzahlige Perioden, die perfekt auf die Texturgrößen abgestimmt sind, um sichtbare Nähte zu vermeiden. Das Skill liefert vorgefertigte Materialien wie Holzdielen (mit versetzten Fugen, individueller Maserung, Ästen und Mikrofasen), Leder, Stoffe (Webmuster, Frottee, Rippstrick, Filz, Kordel), Lackierungen mit Orangenhaut, Gebrauchsspuren (Staub, Fingerabdrücke, Kratzer, Krümel, Fusseln) sowie Buchumschläge mit passender Geometrie, Seiten und Platzhaltertext. Jede Textur ist deterministisch (Seed-basiert), wiederholbar und wird mit dem Werkzeug `seamScore` auf Nahtfreiheit geprüft. Der Fokus liegt auf Realismus durch Roughness-Maps, nicht reine Farbtexturen – Gebrauchsspuren werden simultan in die Farb- und Roughness-Kanäle gerendert.

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

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

Prozedurale Texturen in three.js

Quelle: room-at-dawn (MIT), entnommen aus src/core/tex.js, rng.js, src/scene/materials.js und den Materialfunktionen in parts/. Das ursprüngliche Schlafzimmer enthält keine einzige Bilddatei – alle Texturen werden beim Laden prozedural generiert.

Kernideen:

  1. Physikalische Einheiten verwenden. Höhen in Millimetern, Texturgitter sind in Metern angegeben, UVs in Metern. Dadurch entspricht repeat = 1 / tileMeter und eine Änderung der Auflösung ändert das Aussehen nicht.
  2. Der Großteil der „Realitätsnähe“ liegt in der Rauheit, nicht in der Farbe. Fingerabdrücke, Wischspuren, Staub sind farblich kaum sichtbar – sie treten erst unter Glanzlicht auf.
  3. Immer wiederholbar und reproduzierbar. Rauschen hat Perioden, Zufallszahlen laufen über RNG(seed). Derselbe Seed liefert jedes Mal dasselbe Ergebnis (wichtig für Light Baking und Screenshot-Regressionstests).

Dateien

PfadInhalt
scripts/tex.jsGrundlagen: RNG, pnoise/pfbm (mit unterschiedlichen Perioden pro Achse), worley, vn (schnelles, nachgeschlagenes Rauschen), field, normalBytes (Millimeter-Einheiten), dataTex/canvasTex/packTex/colorTex, avgColor, once (Cache), rep (Textur wiederverwenden, nur Repeat ändern), seamScore, texData
scripts/surfaces.jswallNormal + wallPatch (Holzspan-Tapete mit 3,2 m Putz- und Farbvariation), lacquerNormal, smudgeRough, dustRough, floorMaps, woodMaps, oakVeneer
scripts/textiles.jsweaveNormal, waffleNormal, terryNormal, ribNormal, knitNormal, feltNormal, ropeNormal, fabricMaterial (Sheen + Rückseitendurchscheinen)
scripts/wear.jswornMaps (eine ganze Oberfläche mit Gebrauchsspuren: Farb- und Rauheitskarte), speckleTexture, scuffTexture, sowie Basis-Pinsel softBlob, strand, fingerprint, noiseTile, overlay
scripts/print.jsword/phrase (Platzhaltertext aus Silben), PAL, packer, fitText, paperGrain, makeBook + bookAtlas + bookGeometry, pagesTexture, topoPoster, photoPrints
example/Eine Raumecke, jede Oberfläche verwendet eine Textur aus der Bibliothek. ?cam= (room, desk, glint, fabric, floor, wall, books); ?flat=1 wechselt zu Volltonfarbe
example/preview.jpgBeispiel-Screenshot
references/recipes.mdVorgehen, Abmessungen, Parameter jeder Textur und wie man neue hinzufügt
references/verify-engines.mdValidierungsmethoden, aufgetretene Probleme, Leistung und Portierung nach Godot/Unreal

Beispiel ausführen

cd <skill-ordner> && python3 -m http.server 5422 --bind 127.0.0.1
# Öffne http://127.0.0.1:5422/example/   (window.__tex enthält die Generierungszeit, den Naht-Score und die Durchschnittsfarbe jeder Textur)

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

Verwendung

import { rep } from './scripts/tex.js';
import { floorMaps, wallNormal, wallPatch, lacquerNormal } from './scripts/surfaces.js';
import { knitNormal, fabricMaterial } from './scripts/textiles.js';
import { wornMaps } from './scripts/wear.js';

const fl = floorMaps();                                   // UVs in Metern; repeat ist bereits eingestellt
floor.material = new THREE.MeshStandardMaterial({ map: fl.map, normalMap: fl.normalMap, roughnessMap: fl.roughnessMap, roughness: 1 });
wall.material = wallPatch(new THREE.MeshStandardMaterial({ color: 0xebebe6, roughness: 0.93, normalMap: wallNormal() }));
door.material = new THREE.MeshStandardMaterial({ color: 0xdddddd, roughness: 0.6, normalMap: rep(lacquerNormal(), 9), normalScale: new THREE.Vector2(0.18, 0.18) });
sweater.material = fabricMaterial(0x6f7f6a, { normal: knitNormal(), tileM: 0.1 });
const w = wornMaps({ sizeM: [1.2, 0.6], hands: [[0.55, 0.5]], rings: [[0.9, 0.4, 0.032, 0.6]], prints: 6 });
deskTop.material = new THREE.MeshStandardMaterial({ map: w.map, roughnessMap: w.roughnessMap, roughness: 1 });
  • Bei Materialien mit roughnessMap muss roughness auf 1 gesetzt werden. three.js multipliziert beide.
  • Die Rauheit von packTex und wornMaps liegt im G-Kanal; Graustufen-Canvas können direkt verwendet werden.
  • Jede Textur gibt avg (lineare Durchschnittsfarbe) zurück, zur Verwendung mit threejs-baked-gi als Albedo für indirektes Licht.

Wichtige Regeln

  1. Kein Math.random() verwenden. Jede Textur benötigt einen festen Seed.
  2. Die Periode des Rauschens muss ganzzahlig und mit der Texturgröße ausgerichtet sein (z. B. pfbm(u*6, v*6, oct, seed, 6)). Ohne Ausrichtung entstehen Nähte. Mit seamScore prüfen.
  3. Höhen in Millimetern, mit normalBytes(H, w, h, mmProGitter). Bei Auflösungsänderung ändert sich die Stärke der Reliefdarstellung nicht; einige Materialien haben nicht-quadratische Gitter (Boden 1.1 × 1.9 mm), daher beide Achsen getrennt angeben.
  4. Rauheit zusammen mit der Farbe rendern. wornMaps zeichnet jede Aktion gleichzeitig in zwei Canvas und verwendet denselben new RNG(i), sodass die Formen übereinstimmen.
  5. Bei dunklen Oberflächen Partikel und Glanzlichter reduzieren (im Beispiel dunkle Tischplatte von 9000 auf 2500), sonst wirkt es wie Granit.
  6. Auf Canvas gezeichnete Texte und Muster immer selbst erstellen (word(), geometrische Formen); keine echten Buchtitel, Marken oder Logos.
  7. Die größte Textur (2048²) benötigt 0,1–0,35 s; mit once cachen und mit rep() wiederverwenden. Nicht für jedes Objekt neu generieren.

Performance (RTX 4090, Chrome headless, gesamtes Beispiel 1,1 s)

TexturGrößeZeitNaht-Score (x/y)
floorMaps2048² × 30,32 sFarbe 0,96/1,10; Normal 1,00/1,02; Rauheit 0,89/1,05
woodMaps1024² × 30,20–0,23 sFarbe 0,93/1,12; Normal 1,30/1,06
wornMaps (1,2 × 0,6 m, 3400 px/m)4080×2040 + halbe Rauheit0,13 sNicht wiederholt
oakVeneer1024² × 30,10 s0,98–1,06
wallNormal1024²0,04 s1,00/1,07
lacquerNormal, smudgeRough512²0,02–0,04 s0,98–1,04
7 Stoffarten128²–512²1–19 ms0,94–1,10 (Kordel y = 2,03, absichtliche Rille, siehe verify-engines.md)
bookAtlas (12 Bücher)2048×15360,05–0,08 s—

Ein Naht-Score von etwa 1 bedeutet keine sichtbare Naht. Werte über 2 erfordern eine Überprüfung. Bei der Berechnung wird auf Zähler und Nenner jeweils 1 Farbstufe addiert, um zu verhindern, dass nahezu rauschfreie Richtungen (z. B. bei Langholz) durch Rauschen unter 1 Farbstufe einen unnötig hohen Wert erhalten.

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-sky-backdrop

在 three.js 用程式做天空與窗外遠景,不需要 HDRI 或圖檔。天空的同一份參數同時用在三個地方:烘焙光照用的解析式天空、看得到的天空球(雲層、高空薄雲、地平線霧帶、太陽),以及不烘焙時用的太陽光、半球光與環境貼圖。內含四種預設(清晨、白天、陰天、黃昏)和一個量測工具,確認看到的天空和照亮場景的天空亮度一致。遠景部分包括:只建從室內窗戶看得到的東西(窗洞可見性與 LOD)、隨距離變淡的大氣霧化、遠處逐漸變粗的草地網格、碎石小路、樹籬、鄰居房子(陶瓦屋頂、窗戶、煙囪、天窗)、封住地平線的遠方樹牆,並可以搭配 threejs-procedural-vegetation 種樹。當使用者說「天空」「sky shader」「雲」「程式生成天空」「不用 HDRI」「窗外景色」「遠景」「背景房子」「地平線」「大氣透視」「霧化」「窗外的樹」「天空和光照對不上」「清晨/黃昏/陰天的天空」「只建看得到的東西」時使用。

Verwandte Skills