CommunityImagemgithub.com

threejs-procedural-cloth

Gere tecidos estáticos foto-realistas proceduralmente (sem simulação física): edredons, cobertores, toalhas de mesa, panos pendurados, cantos virados, objetos sobre tecido e cortinas penduradas em varões. Baseia-se em campos de altura (lobos + dobras direcionais + picos aplainados + vincos traçados individualmente) → draping sobre suporte → tombamento de dobras altas → virada de cantos → relaxamento UV em superfície 3D → mapa normal de rugas finas + escurecimento de cavidades. Inclui biblioteca reutilizável, exemplos em etapas, dados de verificação e instruções de portabilidade para Godot/Unreal.

O que é threejs-procedural-cloth?

Esta skill implementa uma abordagem procedural para gerar tecidos estáticos com aparência foto-realista, sem recorrer a simulação física. Ela é ideal para cenas que exigem edredons, cobertores, toalhas de mesa, panos pendurados em bordas de móveis, cantos virados ou cortinas com dobras complexas. A técnica principal consiste em definir um campo de altura sobre o qual são aplicados lobos (formas amplas), dobras direcionais longas, aplainamento de picos e vincos individuais traçados como segmentos. Esse campo é então mapeado sobre um suporte (como uma cama), as dobras mais altas são tombadas para um lado, cantos são virados (enrolados e achatados), e as coordenadas UV são relaxadas para evitar estiramento de texturas. Para cortinas, o método muda: cada seção horizontal é tratada como um fio de comprimento fixo, resolvendo o ângulo de curvatura por bissecção para que a largura da cortina corresponda à largura desejada. A skill oferece uma biblioteca JavaScript (ES module) com funções para todos os passos, exemplos interativos (um para edredom, outro para cortinas) que podem ser visualizados em etapas, e dados de verização (como estiramento UV e cruzamentos de malha). O código é deterministico (usa semente para geração de números aleatórios) e roda em cerca de 0,5 segundos para uma malha de ~130 mil triângulos. A documentação inclui referências detalhadas sobre cada aspecto (formas, draping, UV, materiais, verificação e portabilidade para Godot/Unreal).

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

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

Tecidos Programados (sem simulação)

Fonte: room-at-dawn (MIT), src/scene/parts/bed.js (edredom, cobertor, travesseiro). Aqui foi extraído para uma biblioteca reutilizável, com um exemplo que pode ser visualizado em etapas.

Ideia central: o tecido não é "simulado", é "projetado". Em coordenadas planas, define-se "o quanto cada ponto do tecido está mais alto que o suporte" e depois mapeia-se esse plano sobre o suporte. As vantagens são: cada passo é controlável e reproduzível (mesma semente sempre gera o mesmo resultado), a construção leva menos de 0,5 segundos, e outros objetos (livros, celular, outro cobertor) podem consultar a mesma função de altura, garantindo que fiquem sobre o tecido. A desvantagem é que o tecido é estático: não é empurrado por personagens (para interação, veja references/engines.md).

Arquivos

CaminhoConteúdo
scripts/cloth.jsBiblioteca (ES module, depende apenas de three): RNG/ruído, Field, lobos, famílias de dobras, vincos, draping sobre suporte, virada de cantos, malha, relaxamento UV, textura de rugas, estampa, material de algodão, exportableMesh (conversão antes de exportar GLB)
example/index.html + main.jsUm edredom desarrumado sobre uma cama, ?stage=1..5 para adicionar cada efeito progressivamente
scripts/curtain.jsCortina: curtainPanel (integração de seção transversal sem esticar), auditPanel, linenTextures (linho liso), curtainMaterial (bainhas, costuras, rugas de armazenamento, translucidez contraluz, micro-ondulação), curtainRing
example/curtain.htmlUm par de cortinas penduradas em frente a uma janela, ?cam= (front, angle, top, hem, stitch, above), ?tied=1, ?fullness=, ?loops=, ?tex=checker
example/preview-*.jpgImagens de exemplo concluídas e de cada etapa (preview-curtain.jpg é a cortina)
references/shape.mdDesign do campo de altura: lobos, dobras longas, aplainamento de picos, vincos, regiões planas
references/drape-curl.mdSuporte, tombamento, distorção planar, virada de cantos, bainhas, colocar objetos sobre o tecido, sobrepor segunda camada
references/uv-material.mdRelaxamento UV, mapa normal de rugas finas + cavidade, estampa, material
references/verification.mdQuais dados verificar, quais ângulos de câmera, tabela de sintomas comuns
references/curtain.mdCortinas: integração de seção transversal e solução de largura, composição de θ(s), material, parâmetros, verificação, problemas encontrados
references/engines.mdPortabilidade para Godot/Unreal: exportar GLB, reescrever em GDScript/C++, como integrar tecidos interativos

Executando o Exemplo

cd <pasta da skill> && python3 -m http.server 5420 --bind 127.0.0.1
# Abra http://127.0.0.1:5420/example/

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

Parâmetros de URL:

  • stage=1..5: respectivamente, lobos, adicionar dobras longas, adicionar aplainamento de picos, adicionar vincos, adicionar virada de cantos e tombamento.
  • cam=wide|close|top|side|left|foot: câmera padrão.
  • tex=checker: substitui por um grid de 10 cm para verificar estiramento UV.
  • relax=0: desliga o relaxamento UV, para comparação.
  • ui=0: esconde o painel de dados, útil para capturas de tela.

Após a conclusão, window.__cloth conterá os dados de verificação, e body[data-ready="1"] indica que a cena está pronta para captura. O botão "Baixar GLB" permite exportar o tecido para uso em outros motores.

Fluxo

EtapaO que fazPor quêBiblioteca
1Define o contorno (quadrilátero) e a "distância até a bainha" em coordenadas planasBainhas, desaparecimento de vincos, virada de cantos precisam dissoquadEdge
2Lobos: posiciona manualmente 5–10 elipses, cada uma com altura e orientação, combinadas com smooth-maxA forma geral determina "em que estado o edredom está"; ruído não consegue fazer issomakeLobes lobesAt
3Dobras longas: 2–3 grupos de ruído billow direcional, alternando direção conforme a regiãoAs dobras do edredom seguem a direção em que ele é esticadofoldFamily
4Faz ondas longitudinais nas partes penduradas; domain warp global; soft cap limita a alturaTecido pendurado não é plano; evita linhas retas artificiais; o lobo mais alto não deve ser exageradosoftCap
5Aplainamento de picos: cada ponto pode ser no máximo ~1,2 cm mais alto que a vizinhança (após duas borradas), vales permanecem nítidosTecido com enchimento não tem picos; esta etapa transforma de "montanha" em "edredom"Field.erodePeaks
6Vincos traçados um a um: a partir de pontos de aperto, irradiam em leque; as demais áreas seguem o campo de tensão; atenuam perto de regiões planas e bainhasVincos feitos com ruído parecem mármore; precisam ser segmentos com perfil de "tenda"CreaseSet crease
7Bainha: faixa plana, sulco da costura, franzidoAs bordas são geometria real, necessárias para verossimilhança em closeExemplo hemElev
8Draping sobre suporte: região plana + cantos arredondados + queda verticalUm único plano pode representar tanto a parte sobre a cama quanto a parte penduradaboxSupport
9Tombamento de dobras altas: a distância do tombamento depende da altura localAs protuberâncias ficam com um lado íngreme e outro suave, em vez de simétricas como pãesExemplo place
10Virada de cantos: a parte que ultrapassa a linha de dobra é enrolada em um cilindro e depois achatada sobre o edredom; a área pressionada é marcada como planaAdiciona um detalhe que conta uma históriacurl
11Relaxamento UV na superfície 3D (multigrid, restrições de comprimento de aresta)Estampas em dobras íngremes não ficam esticadasrelaxUV uvStretch
12Material: mapa normal de rugas finas repetível (alpha armazena cavidade) + estampa + sheenA geometria lida com centímetros, a textura lida com milímetroswrinkleTexture sprigPrintTexture cottonMaterial

Regras Obrigatórias

  1. Aleatoriedade sempre via RNG(semente)/pn(...,semente), nunca Math.random(). Dependemos disso para regressão de capturas de tela, baking de iluminação e sincronização multiusuário.
  2. Formas grandes usam interpolação cúbica (Field.cubic), vincos usam bilinear (Field.bil). Se formas grandes usarem bilinear, a malha apresentará facetas de 5 mm.
  3. Vincos não devem ser feitos com ruído. Ruído produz aglomerados; vincos reais são linhas direcionais que afinam nas pontas.
  4. Primeiro aplaina os picos, depois adiciona os vincos. Se a ordem for invertida, as cristas dos vincos também serão aplainadas.
  5. A região plana sob o canto virado deve cobrir toda a extensão da dobra (o exemplo usa QMAX para calcular automaticamente). Se não cobrir totalmente, a parte virada ficará sobre um lobo alto e a textura esticará em tiras (já ocorreu, veja references/verification.md).
  6. O relaxamento UV usa a forma "não virada" U; o estiramento da parte virada deve ser verificado separadamente. relaxUV exige que o número de divisões seja múltiplo de 8.
  7. Tecido pendurado não pode colidir com objetos abaixo: o exemplo faz o estrado da cama mais estreito que o colchão. Colisões fora do suporte não são tratadas por este método.
  8. Quando dois lados adjacentes estão pendurados simultaneamente, o canto precisa de um formato cônico ou gusset; boxSupport não trata isso. Permita apenas que lados opostos fiquem pendurados.

Valores Iniciais (medidos no exemplo)

  • Espessura do edredom deitado: 5 cm. Altura dos lobos × LOBE_SCALE (0,3 é sono normal, 1 é amontoado). Soft cap máximo: 23 cm.
  • Espaçamento entre dobras longas: ~12 cm, comprimento ~60 cm, amplitude 3–4 cm. Raio de aplainamento: 5 células (2,5 cm), limite 1,2 cm.
  • Largura dos vincos: 2,4–4 cm, altura ~0,16–0,3 vezes a largura, 30% são sulcos. 4–7 vincos por ponto de aperto; 200 grupos espalhados.
  • Malha: ~7 mm (288×192), ~130 mil triângulos. Modelagem: ~0,45 s (sendo ~0,15 s para relaxamento UV). Colisões: 0. Estiramento UV p5/p95: ~0,92/1,08.

Cortinas (tecidos pendurados)

O método do edredom é "campo de altura mapeado sobre suporte", não se aplica a cortinas. Para cortinas, adotamos: cada seção horizontal é um fio de comprimento fixo, desenhado integrando o ângulo de curvatura θ(s) ao longo do tecido, e a largura desejada é obtida ajustando o fator de θ por bissecção. O tecido não estica, então as UVs usam metros diretamente e a textura não deforma. Detalhes em 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 deve ser 0; stretchP95Pct deve ser menor que 1
  • Medido no exemplo: um painel com ~100 mil triângulos, construído em 0,2 s, estiramento p95 de 0,4–0,7%, cruzamentos 0.
  • Problema conhecido: se depth for muito apertado, o tecido perde 5–15% da largura. Se o espaço for insuficiente, reduza fullness, não force a profundidade.
  • Problema conhecido: se a bainha inferior for muito estreita, as dobras podem se cruzar; o limiar depende da semente (no exemplo, o painel direito ainda tinha cruzamentos em ~0,67x e só passou em 0,79x). Verifique crossings e, se necessário, mude a semente.
  • O depth padrão [-0.11, 0.16] não encurta o tecido, mas a haste deve estar a ~12 cm da parede.

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

Habilidades Relacionadas