CommunityImagengithub.com

threejs-procedural-textures

Genera mapas de texturas fotorrealistas proceduralmente en three.js sin usar archivos de imagen: ruido sin costuras, mapas de normales desde campos de altura en milímetros, empaquetado de rugosidad y oclusión ambiental, Canvas2D a textura, promedio de albedo (para horneado de iluminación) y detección de costuras. Incluye texturas listas: papel pintado de viruta de madera rodillo con variaciones de yeso y pintura a gran escala, piel de naranja lacada, rugosidad por desgaste manual, acumulación de polvo, suelo de roble (juntas al tresbolillo, cada tabla con textura única, nudos, biselados en los cuatro bordes), veta de madera genérica, chapa de roble a juego, tejido liso, gofre, toalla, acanalado, punto, fieltro, cuerda de algodón, marcas de uso (polvo, grasa, huellas dactilares, migas, pelusa, pelos, marcas de vasos, arañazos finos, todo dibujado a la vez en color y rugosidad), esmalte moteado, arañazos en pintura en polvo, atlas de cubiertas de libros con geometría UV correspondiente, cantos de páginas, póster de mapa topográfico, fotos y texto falso. Se usa cuando el usuario dice: "textura procedural", "mapa de normales", "suelo de madera", "textura de madera", "la pared se ve demasiado artificial", "textura de tela", "punto/ toalla normal map", "marcas de uso", "arañazos/ huellas dactilares/ polvo", "mapa de rugosidad", "lomo de libro/ cubierta", "texto falso", "la textura tiene costuras" o "pintar textura en Canvas".

¿Qué es threejs-procedural-textures?

Este skill de three.js genera texturas procedurales fotorrealistas sin archivos de imagen, basado en el proyecto room-at-dawn (MIT). Proporciona un conjunto completo de funciones JavaScript para crear mapas de normales, rugosidad, color y oclusión ambiental a partir de campos de altura definidos en milímetros físicos, asegurando que el aspecto sea independiente de la resolución. Incluye más de 20 texturas listas, desde superficies comunes (madera, tela, paredes) hasta marcas de uso detalladas (grasa, polvo, arañazos) y herramientas de utilidad como generación de ruido periódico (pnoise, pfbm, Worley), detección de costuras (seamScore) y empaquetado de texturas. Soporta repetición sin costuras, reproducibilidad mediante semillas fijas (prohibido Math.random()), y está optimizado para rendimiento (0.1-0.35s para 2048²). Es ideal para desarrolladores de three.js que necesitan materiales realistas, horneado de iluminación (proporciona albedo promedio) o texturas dinámicas sin depender de activos externos.

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

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

Materiales de textura procedural

Fuente: room-at-dawn (MIT), de src/core/tex.js, rng.js, src/scene/materials.js y las funciones de material de cada pieza en parts/. El dormitorio del proyecto original no contiene ningún archivo de imagen; todas las texturas se generan proceduralmente al cargar.

Ideas clave:

  1. Diseñar con unidades físicas. La altura se mide en milímetros, se especifica cuántos metros representa un mosaico de textura y la UV también está en metros. De esta forma, repeat = 1 / tileMetros, y cambiar la resolución no altera la apariencia.
  2. La mayor parte del "realismo" está en la rugosidad, no en el color. Las huellas dactilares, las marcas de limpieza y el polvo son casi invisibles en el color; se manifiestan cuando la luz especular los recorre.
  3. Siempre repetible y reproducible. El ruido tiene períodos fijos y los números aleatorios siempre usan RNG(seed). El mismo seed produce siempre el mismo resultado (esencial para horneado de iluminación y pruebas de regresión de capturas de pantalla).

Archivos

RutaContenido
scripts/tex.jsBase: RNG, pnoise/pfbm (períodos diferentes por eje), worley, vn (ruido rápido con tabla de consulta), field, normalBytes (en milímetros), dataTex/canvasTex/packTex/colorTex, avgColor, once (caché), rep (compartir imagen, solo cambiar repeat), seamScore, texData
scripts/surfaces.jswallNormal + wallPatch (papel pintado de viruta de madera con variaciones de yeso y pintura a escala 3.2 m), lacquerNormal, smudgeRough, dustRough, floorMaps, woodMaps, oakVeneer
scripts/textiles.jsweaveNormal, waffleNormal, terryNormal, ribNormal, knitNormal, feltNormal, ropeNormal, fabricMaterial (sheen más transmisión de luz a contraluz)
scripts/wear.jswornMaps (una superficie usada: dos imágenes de color y rugosidad), speckleTexture, scuffTexture, y pinceles básicos softBlob, strand, fingerprint, noiseTile, overlay
scripts/print.jsword/phrase (texto falso a partir de sílabas), PAL, packer, fitText, paperGrain, makeBook + bookAtlas + bookGeometry, pagesTexture, topoPoster, photoPrints
example/Una esquina de la habitación, cada superficie utiliza un material de la biblioteca. ?cam= (room, desk, glint, fabric, floor, wall, books); ?flat=1 cambia a color plano de control
example/preview.jpgCaptura de pantalla de ejemplo
references/recipes.mdMétodo, dimensiones, parámetros de cada material y cómo añadir nuevos
references/verify-engines.mdMétodos de verificación, problemas encontrados, rendimiento y migración a Godot/Unreal

Ejecutar ejemplo

cd <carpeta_del_skill> && python3 -m http.server 5422 --bind 127.0.0.1
# Abrir http://127.0.0.1:5422/example/   (window.__tex tiene el tiempo de generación, puntuación de costura y albedo promedio de cada textura)

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

Uso

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();                                   // UV en metros; repeat ya está configurado
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 });
  • En los materiales con roughnessMap, roughness debe ser 1. three.js multiplica ambos valores.
  • La rugosidad en packTex y wornMaps está en el canal G. También se puede usar un canvas en escala de grises directamente.
  • Cada material devuelve avg (color lineal promedio) para threejs-baked-gi como albedo de la luz reflejada.

Reglas a seguir obligatoriamente

  1. No usar Math.random(). Cada textura debe tener una semilla fija.
  2. El período del ruido debe ser un número entero y alineado con la cuadrícula de la textura (por ejemplo, pfbm(u*6, v*6, oct, seed, 6)). Si no está alineado, aparecen costuras. Usar seamScore para verificar.
  3. La altura se mide en milímetros, usar normalBytes(H, w, h, milimetrosPorCuadro). Al cambiar la resolución, la intensidad de las protuberancias no cambia; algunos materiales no tienen cuadrícula cuadrada (suelo de 1.1 × 1.9 mm), por lo que hay que proporcionar valores separados por eje.
  4. La rugosidad se dibuja junto con el color. Cada trazo de wornMaps se dibuja simultáneamente en dos canvases usando el mismo new RNG(i), para que las formas de ambos queden alineadas.
  5. En superficies oscuras, reducir la cantidad de partículas y puntos brillantes (en el ejemplo, la mesa oscura pasó de 9000 a 2500), de lo contrario parecerá granito.
  6. Todo el texto e imágenes dibujados en Canvas deben ser generados por el código (word(), formas geométricas). No incluir nombres de libros, marcas o logotipos reales.
  7. La textura más grande (2048²) tarda entre 0.1 y 0.35 segundos en crearse. Usar once para cachear la misma textura y rep() para compartirla. No generar una copia para cada objeto.

Rendimiento medido (RTX 4090, Chrome headless, ejemplo completo 1.1 s)

TexturaTamañoTiempoPuntuación de costura (x/y)
floorMaps2048² × 3 imágenes0.32 sColor 0.96/1.10, Normal 1.00/1.02, Rugosidad 0.89/1.05
woodMaps1024² × 30.20–0.23 sColor 0.93/1.12, Normal 1.30/1.06
wornMaps (1.2 × 0.6 m, 3400 px/m)4080×2040 + rugosidad a la mitad0.13 sNo repetible
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 tipos de tela128²–512²1–19 ms0.94–1.10 (la y de la cuerda de algodón es 2.03, es una ranura intencional; ver verify-engines.md)
bookAtlas (12 libros)2048×15360.05–0.08 s—

Una puntuación de costura cercana a 1 indica que no se ven costuras; si es mayor de 2, hay que revisarla. Al calcular, se suma 1 nivel de color al numerador y al denominador para evitar que en direcciones con poca variación (como madera con veta recta) el ruido inferior a 1 nivel de color genere una relación muy grande.

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」「窗外景色」「遠景」「背景房子」「地平線」「大氣透視」「霧化」「窗外的樹」「天空和光照對不上」「清晨/黃昏/陰天的天空」「只建看得到的東西」時使用。

Skills relacionados