CommunityImagegithub.com

threejs-procedural-cloth

Génération procédurale de tissus statiques photoréalistes (sans simulation physique) : couettes non faites, couvertures, nappes, tissus retombant du lit ou de la table, coins relevés, objets posés sur le tissu, et rideaux suspendus à une tringle (plis d'anneaux, retombée et évasement, bas liés, coutures et ourlets doubles, lin à armure toile).

Qu'est-ce que threejs-procedural-cloth ?

Cette compétence permet de générer de manière procédurale des tissus statiques photoréalistes (comme des couettes froissées, des nappes, des rideaux) en quelques secondes, sans aucun moteur physique. Elle utilise un champ de hauteur planaire (bosses, plis longs directionnels, crêtes adoucies, rides tracées une par une) qui est ensuite plaqué sur un support 3D. Les plis hauts s'affaissent d'un côté, les coins peuvent être relevés, et les UV sont relaxés sur la surface 3D pour éviter l'étirement des motifs. Une carte normale de micro-rides et un assombrissement des creux (cavity) viennent finaliser le réalisme. La compétence est fournie sous forme de bibliothèque réutilisable (scripts ES module pour Three.js), avec des exemples progressifs, des données de vérification, et une documentation complète pour le portage vers Godot ou Unreal Engine. Elle répond aux besoins des développeurs et artistes techniques qui veulent un contrôle déterministe et reproductible (même seed = même résultat) sans les aléas et le temps de calcul d'une simulation physique.

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

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Tissu généré par programme (sans simulation)

Source : room-at-dawn (MIT), src/scene/parts/bed.js pour les couettes, couvertures, oreillers. Ce dépôt extrait le code en une bibliothèque réutilisable, accompagnée d'un exemple consultable par étapes.

Idée centrale : le tissu n'est pas « simulé », mais « conçu ». Sur un plan de coordonnées, on définit « de combien chaque point du tissu est plus haut que son support », puis on plaque ce plan sur le support. Avantages : chaque étape est contrôlable, reproductible (même résultat pour une même graine), construit en moins de 0,5 seconde, et d'autres objets (livre, téléphone, autre couverture) peuvent interroger la même fonction de hauteur pour être placés précisément sur le tissu. Inconvénient : le tissu est statique – il ne réagit pas aux personnages (pour l'interactivité, voir references/engines.md).

Fichiers

CheminContenu
scripts/cloth.jsBibliothèque (ES module, dépend seulement de three) : RNG/bruit, Champ, Bosses, Famille de plis, Rides, Drapage sur support, Repli de coin, Grille, Aplatissement UV, Matériau de rides, Motif imprimé, Matériau coton, exportableMesh (conversion avant export GLB)
example/index.html + main.jsUne couette non faite sur un lit, ?stage=1..5 ajoute progressivement chaque effet
scripts/curtain.jsRideaux : curtainPanel (intégration de profil sans allongement), auditPanel, linenTextures (lin toile), curtainMaterial (coutures, ourlets, plis de rangement, translucidité en contre-jour, micro-oscillation), curtainRing
example/curtain.htmlUne paire de rideaux devant une fenêtre, ?cam= (front, angle, top, hem, stitch, above), ?tied=1, ?fullness=, ?loops=, ?tex=checker
example/preview-*.jpgImages finales et par étape de l'exemple (preview-curtain.jpg pour les rideaux)
references/shape.mdConception du champ de hauteur : bosses, longs plis, adoucissement des crêtes, rides, zones plates
references/drape-curl.mdSupports, affaissement, distorsion du plan, repli de coin, ourlets, objets posés sur le tissu, superposition d'une deuxième couche
references/uv-material.mdAplatissement UV, carte normale de micro-rides + cavity, motif imprimé, matériau
references/verification.mdDonnées à vérifier, angles de caméra, symptômes courants et solutions
references/curtain.mdRideaux : intégration de profil et résolution de largeur, composition de θ(s), matériau, paramètres, vérification, problèmes rencontrés
references/engines.mdPortage vers Godot/Unreal : export GLB, réécriture en GDScript/C++, intégration de tissu interactif

Exécuter l'exemple

cd <dossier de la compétence> && python3 -m http.server 5420 --bind 127.0.0.1
# Ouvrir http://127.0.0.1:5420/example/

(<dossier de la compétence> est le répertoire de base affiché lors du chargement de cette compétence ; lorsqu'elle est installée comme plugin, elle se trouve sous ~/.claude/plugins/cache/)

Paramètres d'URL :

  • stage=1..5 : respectivement bosses, ajout de longs plis, adoucissement des crêtes, rides, repli de coin et affaissement.
  • cam=wide|close|top|side|left|foot : caméra par défaut.
  • tex=checker : motif damier de 10 cm pour vérifier l'étirement UV.
  • relax=0 : désactive l'aplatissement UV pour comparaison.
  • ui=0 : cache le panneau de données pour les captures d'écran.

Une fois terminé, window.__cloth contient les données de vérification, et body[data-ready="1"] indique que la capture d'écran est possible. Le bouton « Télécharger GLB » permet d'exporter le tissu vers d'autres moteurs.

Processus

ÉtapeActionPourquoiBibliothèque
1Définir le contour (quadrilatère) dans le plan et la « distance à l'ourlet »Ourlet, fondu des rides, repli de coinquadEdge
2Bosses : 5 à 10 ellipses placées manuellement, chacune avec hauteur et angle, reliées par smooth-maxLa forme générale détermine « l'état de la couette » – impossible avec du bruitmakeLobes lobesAt
3Plis longs : 2–3 groupes de bruit billow directionnel, changeant de direction selon la zoneLes plis d'une couette suivent la direction de la tensionfoldFamily
4Ondulations verticales dans les parties retombantes ; déformation globale du domaine ; limite haute par soft capLe tissu qui pend n'est pas plat ; éviter les lignes trop droites ; crête maximale raisonnablesoftCap
5Adoucissement des crêtes : chaque point ne dépasse pas d'environ 1,2 cm la moyenne floutée deux fois, les creux restent netsUn tissu rembourré n'a pas de pics – cela transforme une « montagne » en « couette »Field.erodePeaks
6Rides tracées une par une : à partir de points de pincement, elles rayonnent en éventail, sinon réparties selon le champ de tension, atténuées près des zones plates et des ourletsLe bruit produit des rides marbrées, alors que les vraies rides sont des segments en forme de tenteCreaseSet crease
7Ourlet : bande plate, rainure de couture, fronceLes bords sont de vraies géométries pour être crédibles en gros planExemple hemElev
8Plaquage sur support : zone plate + arrondi + chute verticaleUn seul plan peut représenter à la fois le dessus du lit et le bordboxSupport
9Affaissement des plis hauts d'un côté : la distance d'affaissement dépend de la hauteur localeUne bosse devient asymétrique (un côté raide, l'autre doux), pas un dôme symétriqueExemple place
10Repli de coin : la partie qui dépasse de la ligne de pli s'enroule d'abord en cylindre, puis se couche à plat sur la couette ; la zone écrasée est marquée comme plateAjoute un détail narratifcurl
11Aplatissement UV sur la surface 3D (multi-grille, contrainte de longueur d'arête)Les motifs imprimés ne s'étirent pas sur les plis abruptsrelaxUV uvStretch
12Matériau : carte normale de micro-rides répétable (alpha = cavity) + motif imprimé + sheenLa géométrie gère le centimètre, la texture gère le millimètrewrinkleTexture sprigPrintTexture cottonMaterial

Règles à respecter impérativement

  1. L'aléatoire utilise impérativement RNG(seed) / pn(...,seed), pas Math.random(). Les captures d'écran, le baking d'éclairage et la synchronisation multi-utilisateur en dépendent.
  2. Les grandes formes sont échantillonnées par interpolation cubique (Field.cubic), les rides par bilinéaire (Field.bil). Si les grandes formes utilisaient la bilinéaire, on verrait des facettes de 5 mm sur la grille.
  3. Les rides ne doivent pas être générées par bruit. Le bruit produit des amas ; les vraies rides sont des lignes directionnelles qui s'affinent à leurs extrémités.
  4. Adoucir les crêtes d'abord, ajouter les rides ensuite. Si l'ordre est inversé, les arêtes des rides sont également adoucies.
  5. La zone plate sous un coin replié doit couvrir toute la région du pli (l'exemple utilise QMAX pour le calcul automatique). Sinon, le coin replié repose sur des bosses et le motif s'étire en bandes (problème réel, voir references/verification.md).
  6. L'aplatissement UV utilise la forme « non repliée » U ; l'étirement du coin replié est vérifié séparément. relaxUV exige que le nombre de divisions soit un multiple de 8.
  7. Le tissu retombant ne doit pas entrer en collision avec des objets en dessous : dans l'exemple, le cadre du lit est plus étroit que le matelas. Les collisions hors support ne sont pas gérées par cette méthode.
  8. Quand deux bords adjacents tombent simultanément, le coin nécessite une pièce triangulaire ou conique ; boxSupport ne le gère pas. Limitez-vous à deux bords opposés.

Valeurs initiales (testées dans l'exemple)

  • Épaisseur à plat de la couette : 5 cm, hauteur des bosses multipliée par LOBE_SCALE (0,3 pour une couette normalement utilisée, 1 pour une grosse bosse), limite haute soft cap 23 cm.
  • Espacement des plis longs : environ 12 cm, longueur environ 60 cm, amplitude 3–4 cm ; rayon d'adoucissement 5 unités (2,5 cm), limite 1,2 cm.
  • Largeur des rides : 2,4–4 cm, hauteur environ 0,16–0,3 fois la largeur, 30 % encoches ; 4–7 rides par point de pincement, 200 réparties ailleurs.
  • Grille : environ 7 mm (288×192), environ 130 000 triangles, modélisation en environ 0,45 s (dont 0,15 s pour l'aplatissement UV), 0 interpénétration, étirement UV p5/p95 environ 0,92/1,08.

Rideaux (tissu suspendu)

La méthode pour les couettes (« champ de hauteur plaqué sur support ») ne s'applique pas aux rideaux. Pour les rideaux : chaque section horizontale est une ligne de longueur fixe, dessinée en intégrant l'angle de progression θ(s) le long du tissu, puis on ajuste le facteur multiplicatif de θ par dichotomie pour que cette colonne ait exactement la largeur souhaitée à cette hauteur. Le tissu ne s'allonge pas, donc les UV sont en mètres et les motifs ne se déforment pas. Détails dans 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 doit être 0 ; stretchP95Pct doit être inférieur à 1
  • Testé : un panneau d'environ 100 000 triangles, construit en 0,2 s, étirement p95 de 0,4–0,7 %, 0 croisement.
  • Piège : si depth est trop serré, le tissu perd 5–15 % de largeur. Réduisez fullness, ne compressez pas la profondeur.
  • Piège : si l'ourlet est trop étroit, les plis se croisent – le seuil dépend de la graine (dans l'exemple, le panneau droit a encore des croisements à environ 0,67x, mais pas à 0,79x). Surveillez crossings, changez de graine si nécessaire.
  • Par défaut, depth [-0.11, 0.16] ne raccourcit pas le tissu, mais la tringle doit être à environ 12 cm du mur.

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 associés