CommunityImagengithub.com

threejs-procedural-cloth

Diseña telas estáticas fotorrealistas de forma procedural (sin simulación física): mantas, alfombras, cortinas, telas colgando de bordes de camas o mesas, esquinas dobladas, objetos sobre la tela y cortinas colgadas de barras con anillos, pliegues, costuras y texturas de lino.

¿Qué es threejs-procedural-cloth?

Esta habilidad permite generar telas estáticas fotorrealistas mediante un enfoque de diseño procedural, evitando simulaciones físicas. Está pensada para desarrolladores y artistas técnicos que necesiten crear mantas, sábanas, cortinas o cualquier tela colgante de forma rápida, reproducible y controlable. Soporta plataformas Three.js, Godot y Unreal Engine, ofreciendo un conjunto de herramientas modulares: un campo de alturas con lóbulos, pliegues direccionales, crestas suavizadas, arrugas dibujadas a mano, drapeado sobre soportes, doblado de esquinas, mapeado UV relajado sobre superficies 3D, normal maps de arrugas finas y oscurecimiento de cavidades. Incluye un ejemplo interactivo con etapas progresivas y datos de verificación. El usuario puede controlar cada paso mediante parámetros URL, exportar a GLB y verificar la calidad con métricas como stretch y crossings. Está documentada con referencias detalladas para cada subproceso y para la migración a otros motores.

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

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

Diseño Procedural de Telas (Sin Simulación)

Fuente: room-at-dawn (MIT), src/scene/parts/bed.js (mantas, alfombras, almohadas). Aquí se desglosa en una biblioteca reutilizable, acompañada de un ejemplo que puede visualizarse por etapas.

Idea central: la tela no se "simula", se "diseña". Sobre coordenadas planas se define "cuánto más alto está cada punto de la tela respecto al soporte", y luego se envuelve ese plano sobre el soporte. La ventaja es que cada paso es controlable y reproducible (mismo seed → mismo resultado), se construye en menos de 0.5 segundos, y otros objetos (libros, teléfonos, otra manta) pueden consultar directamente la misma función de altura, asegurando que queden sobre la tela. El costo es que la tela es estática: no es empujada por personajes (para interactividad, ver references/engines.md).

Archivos

RutaContenido
scripts/cloth.jsBiblioteca (módulo ES, solo depende de three): RNG/ruido, Field, lóbulos, familias de pliegues, arrugas, drapeado sobre soporte, doblado de esquinas, malla, relajación UV, textura de arrugas, estampado, material de algodón, exportableMesh (conversión antes de exportar GLB)
example/index.html + main.jsUna manta sin tender sobre una cama, ?stage=1..5 añade efectos progresivamente
scripts/curtain.jsCortinas: curtainPanel (integración de sección transversal sin estiramiento), auditPanel, linenTextures (lino tejido plano), curtainMaterial (costuras, puntadas, pliegues de almacenamiento, translucidez contraluz, micro-ondulación), curtainRing
example/curtain.htmlUn par de cortinas colgadas frente a una ventana, ?cam= (front, angle, top, hem, stitch, above), ?tied=1, ?fullness=, ?loops=, ?tex=checker
example/preview-*.jpgImágenes de ejemplo terminadas y por etapas (preview-curtain.jpg es la cortina)
references/shape.mdDiseño del campo de alturas: lóbulos, pliegues largos, crestas suavizadas, arrugas, zonas planas
references/drape-curl.mdSoportes, inclinación, deformación del plano, doblado de esquinas, costuras, colocar objetos sobre la tela, superponer una segunda capa
references/uv-material.mdRelajación UV, normal map de arrugas finas + cavidad, estampado, material
references/verification.mdQué datos revisar, qué tomas de cámara, tabla de síntomas comunes
references/curtain.mdCortinas: integración de sección transversal y resolución de ancho, composición de θ(s), material, parámetros, verificación, problemas encontrados
references/engines.mdMigración a Godot/Unreal: exportación GLB, reescritura en GDScript/C++, cómo integrar telas interactivas

Ejecutar el ejemplo

cd <carpeta_del_skill> && python3 -m http.server 5420 --bind 127.0.0.1
# Abrir http://127.0.0.1:5420/example/

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

Parámetros URL:

  • stage=1..5: lóbulos, añadir pliegues largos, crestas suavizadas, arrugas, doblado de esquinas e inclinación.
  • cam=wide|close|top|side|left|foot: cámaras predefinidas.
  • tex=checker: cambia a cuadrícula de 10 cm para comprobar estiramiento UV.
  • relax=0: desactiva la relajación UV, para comparar.
  • ui=0: oculta el panel de datos, útil para capturas.

Al finalizar, window.__cloth contiene los datos de verificación, y body[data-ready="1"] indica que ya se puede capturar. El botón "Descargar GLB" permite exportar la tela para otros motores.

Flujo de trabajo

PasoQué se hacePor quéBiblioteca
1Definir el contorno (cuatro esquinas) y la "distancia al borde" en coordenadas planasSe necesita para costuras, desvanecimiento de arrugas, doblado de esquinasquadEdge
2Lóbulos: colocar manualmente 5–10 elipses, cada una con altura y ángulo, unidas con smooth-maxLa forma grande define "en qué estado está la manta"; el ruido no logra estomakeLobes lobesAt
3Pliegues largos: 2–3 grupos de ruido billow con dirección, cambiando de orientación según la zonaLos pliegues de una manta siguen la dirección de la fuerza que los generafoldFamily
4Ondas longitudinales en las partes colgantes; domain warp global; soft cap para limitar alturaLa tela que cuelga no es plana; evitar líneas rectas de regla; que el lóbulo más alto no sea exageradosoftCap
5Crestas suavizadas: cada punto no supera ~1.2 cm por encima de su entorno (difuminado dos veces), los valles se mantienen afiladosLas telas con relleno no tienen picos; este paso las transforma de "montañas" a "mantas"Field.erodePeaks
6Dibujar arrugas una a una: desde puntos de sujeción en abanico, y dispersas en el resto siguiendo el campo de tensión, atenuadas cerca de zonas planas y bordesLas arrugas con ruido parecen mármol; se necesitan segmentos con perfil de tienda de campañaCreaseSet crease
7Costuras: banda plana, ranura de puntada, fruncidoEl borde debe ser geometría real para que se vea creíble de cercaEjemplo hemElev
8Envolver sobre el soporte: zona plana + esquinas redondeadas + caída verticalUn solo plano puede representar tanto la parte sobre la cama como la que cuelgaboxSupport
9Inclinar los pliegues altos hacia un lado: la distancia de inclinación depende de la altura en cada puntoLos bultos se vuelven asimétricos: un lado empinado, otro suave, no como panes simétricosEjemplo place
10Doblar esquinas: la parte que cruza la línea de pliegue primero se enrosca en un cilindro y luego se tumba sobre la manta; la zona presionada se marca como planaAñade un detalle narrativocurl
11Relajar UV sobre la superficie 3D (malla múltiple, restricción de longitud de borde)Los estampados en pliegues pronunciados no se alarganrelaxUV uvStretch
12Material: normal map de arrugas finas repetible (alpha guarda cavidad) + estampado + sheenLa geometría maneja centímetros, las texturas manejan milímetroswrinkleTexture sprigPrintTexture cottonMaterial

Reglas obligatorias

  1. El azar siempre va por RNG(seed)/pn(...,seed), no uses Math.random(). Depende de ello la reproducibilidad de capturas, horneado de iluminación y sincronización multijugador.
  2. Las formas grandes se muestrean con interpolación cúbica (Field.cubic), las arrugas con bilineal (Field.bil). Si las formas grandes usan bilineal, se ven facetas de 5 mm en la malla.
  3. No hagas arrugas con ruido. El ruido produce manchas; las arrugas reales son líneas con dirección y extremos que se estrechan.
  4. Primero suaviza crestas, luego añade arrugas. Si se invierte el orden, las líneas de los pliegues también se aplanan.
  5. La zona plana bajo la esquina doblada debe cubrir todo el rango del pliegue (el ejemplo usa QMAX para calcularlo automáticamente). Si no se cubre, la parte doblada se superpone sobre lóbulos altos y el estampado se alarga en franjas (problema real, ver references/verification.md).
  6. La relajación UV usa la forma "sin doblar" U; el estiramiento de la parte doblada se revisa aparte. relaxUV requiere que el número de celdas sea múltiplo de 8.
  7. La tela que cuelga no debe chocar con objetos debajo: el ejemplo hace el armazón de la cama más estrecho que el colchón. Las colisiones fuera del soporte no están dentro del alcance de este método.
  8. Cuando dos bordes adyacentes cuelgan a la vez, la esquina necesita una forma cónica o una pieza triangular; boxSupport no lo maneja. Deja solo dos lados opuestos colgando.

Valores de partida (medidos en el ejemplo)

  • Grosor de la manta extendida: 5 cm; altura de lóbulos × LOBE_SCALE (0.3 es normal después de dormir, 1 es apilado), soft cap máximo 23 cm.
  • Separación entre pliegues largos: ~12 cm, longitud ~60 cm, amplitud 3–4 cm; radio de suavizado de crestas: 5 celdas (2.5 cm), límite 1.2 cm.
  • Ancho de arrugas: 2.4–4 cm, altura ~0.16–0.3 veces el ancho, 30% son surcos; cada punto de sujeción genera 4–7 líneas, otras 200 dispersas.
  • Malla: ~7 mm (288×192), ~130 000 triángulos, modelado ~0.45 s (de los cuales relajación UV ~0.15 s), sin penetraciones, estiramiento UV p5/p95 ~0.92/1.08.

Cortinas (tela colgante)

El método de la manta era "campo de alturas envuelto sobre un soporte"; para cortinas no funciona. En su lugar: cada sección horizontal es una línea de longitud fija, dibujada integrando el ángulo de avance θ(s) a lo largo de la tela, y usando bisección para ajustar el múltiplo de θ de modo que esa fila tenga exactamente el ancho deseado a esa altura. La tela no se estira, por lo que la UV se mide en metros directamente y la textura no se deforma. Detalles en references/curtain.md.

import { curtainPanel, auditPanel, linenTextures, curtainMaterial, curtainRing, CU } from './scripts/curtain.js';
const p = curtainPanel({ x0t: 0.27, x1t: 0.95, x0h: 0.25, x1h: 0.97, zc: 0.12, yTop: 2.29, yHem: 0.02, loops: 7, seed: 4101 });
const lin = linenTextures();
scene.add(new THREE.Mesh(p.geo, curtainMaterial({ map: lin.map, normalMap: lin.normalMap, yTop: 2.29 })));
console.log(auditPanel(p));   // crossings debe ser 0; stretchP95Pct debe ser menor que 1
  • Medido en el ejemplo: un panel ~100 000 triángulos, ~0.2 s de construcción, estiramiento p95 0.4–0.7 %, cruces 0.
  • Problema conocido: si depth se ajusta demasiado, la tela pierde 5–15 % de ancho. Si falta espacio, reduce fullness, no comprimas la profundidad.
  • Problema conocido: si el dobladillo inferior es demasiado estrecho, los pliegues pueden cruzarse entre sí; el umbral depende del seed (en el ejemplo, el panel derecho aún tiene cruces en ~0.67×, y pasa solo en ~0.79×). Revisa crossings y cambia el seed si es necesario.
  • La profundidad por defecto depth [-0.11, 0.16] no acorta la tela, pero la barra debe estar a unos 12 cm de la pared.

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-textures

在 three.js 用程式即時生成照片級材質貼圖(不用任何圖檔):可無縫重複的雜訊、以公釐為單位的高度場轉 normal map、粗糙度與 AO 打包、Canvas2D 轉貼圖、平均反照率(給光照烘焙用)、接縫檢查。內含現成的材質:滾筒漆木屑壁紙加上大尺度的灰泥與漆色變化、烤漆橘皮紋、手摸過的粗糙度、積灰、橡木地板(交錯接縫、每片紋理不同、節疤、四邊微倒角)、通用木紋、對拼橡木貼皮、平織、鬆餅格、毛巾布、羅紋、針織、毛氈、棉繩、使用痕跡(灰塵、油脂、指紋、碎屑、棉絮、頭髮、杯印、細刮痕,同時畫進顏色與粗糙度)、斑點釉、粉體塗裝刮傷、書封圖集與對應 UV 的書本幾何、書頁邊、地形圖海報、照片、假文字。當使用者說「程式生成貼圖」「procedural texture」「不用圖檔的材質」「normal map 怎麼產生」「木地板/木紋貼圖」「牆面看起來太假」「布料材質」「針織/毛巾布 normal map」「使用痕跡」「刮痕/指紋/灰塵」「粗糙度貼圖」「書封/書背」「假文字」「貼圖有接縫」「Canvas 畫貼圖」時使用。

threejs-sky-backdrop

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

Skills relacionados