Community画像github.com

threejs-procedural-cloth

プログラムで「デザイン」するフォトリアルな静的クロス(物理シミュレーション不要):整っていない布団、毛布、テーブルクロス、ベッドやテーブルから垂れる布、めくれた布端、布の上のオブジェクト、吊り竿カーテン(リングによる折り目・垂れ・裾の結び・ステッチと二重縫い・リネン平織り)。

threejs-procedural-cloth とは?

このスキルは、物理シミュレーションを使わずに、プログラムでフォトリアルな静的な布を生成するためのThree.jsベースのライブラリです。布団、毛布、テーブルクロス、カーテンなど、ベッドやテーブルにかかった布の状態を、高さ場の設計(塊、方向性のある長い折り目、ピーク削減、個別に描画するしわ)とサポート形状へのラッピングで再現します。処理は0.5秒未満で完了し、シード値により完全に再現可能です。段階的なサンプル、検証データ、Godot/Unrealへの移植方法も含まれています。主な機能は、高さ場設計(塊、折り目、しわ、縁処理)、3Dラッピング、ピーク倒し、角めくり、UVリラクゼーション、法線マップ+空洞マップによる細かいしわ表現、プリント模様、カーテンの特殊アルゴリズム(水平断面の長さ固定積分)です。ユーザーが「布をプログラムで生成」「布団/シーツ/毛布/テーブルクロスのモデリング」「布のしわ」「布がベッドから垂れる」「布端がめくれる」「シミュレーションなしの布」「procedural cloth」「布の模様が伸びる」「布がプラスチック/山のように見える」「カーテンのモデリング」「カーテンのしわ」などと言ったときに使用されます。

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

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

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

プログラムでデザインする布(シミュレーションなし)

出典:room-at-dawn(MIT)、src/scene/parts/bed.js の布団、毛布、枕。ここではそれを再利用可能なライブラリに分割し、段階的に確認できるサンプルも付けています。

コアアイデア:布は「シミュレート」するのではなく「デザイン」する。 平面上で「各点の布がサポートよりどれだけ高いか」を定義し、その平面をサポートにラップします。 利点は、各ステップが制御可能で再現可能(同じシードで毎回同じ)、0.5秒未満で構築でき、他のオブジェクト(本、スマホ、別の毛布)も同じ高さ関数を直接参照して布の表面にフィットさせられることです。 代償として布は静的です:キャラクターに押されたりしません(インタラクティブが必要な場合は references/engines.md を参照)。

ファイル

パス内容
scripts/cloth.jsライブラリ(ES module、依存はthreeのみ):RNG/ノイズ、Field、塊、折り目ファミリー、しわ、サポートドレープ、角めくり、メッシュ、UV 平坦化、しわテクスチャ、プリント、コットンマテリアル、exportableMesh(GLB エクスポート前の変換)
example/index.html + main.jsベッドにかけられた整っていない布団、?stage=1..5 で各エフェクトを段階的に追加
scripts/curtain.jsカーテン:curtainPanel(伸長しない断面積分)、auditPanel、linenTextures(リネン平織り)、curtainMaterial(縫い目、ステッチ、収納折り目、逆光透過、微振動)、curtainRing
example/curtain.html窓の前のカーテンペア、?cam=(front、angle、top、hem、stitch、above)、?tied=1、?fullness=、?loops=、?tex=checker
example/preview-*.jpgサンプルの完成図と各段階図(preview-curtain.jpg はカーテン)
references/shape.md高さ場デザイン:塊、長い折り目、ピーク削減、しわ、平坦領域
references/drape-curl.mdサポート、傾倒、平面のねじれ、角めくり、縫い目、布の上に物を置く、2層目の布の重ね
references/uv-material.mdUV 平坦化、細かいしわの法線マップ+空洞マップ、プリント、マテリアル
references/verification.md確認すべきデータ、カメラアングル、よくある問題の対処法
references/curtain.mdカーテン:断面積分と幅の求解、θ(s) の構成、マテリアル、パラメータ、検証、遭遇した問題
references/engines.mdGodot/Unreal への移植:GLB エクスポート、GDScript/C++ への書き換え、インタラクティブ布の連携方法

サンプルの実行

cd <スキルフォルダ> && python3 -m http.server 5420 --bind 127.0.0.1
# ブラウザで http://127.0.0.1:5420/example/ を開く

(<スキルフォルダ> はこのスキル読み込み時に表示される Base directory;プラグインとしてインストールした場合は ~/.claude/plugins/cache/ 以下にあります)

URL パラメータ:

  • stage=1..5:塊、長い折り目追加、ピーク削減追加、しわ追加、角めくりと傾倒追加。
  • cam=wide|close|top|side|left|foot:カメラプリセット。
  • tex=checker:10cm 市松模様に切り替え、UV 伸びをチェック。
  • relax=0:UV 平坦化をオフ、比較用。
  • ui=0:データパネルを非表示、スクリーンショット時に使用。

完了後、window.__cloth に検証データがセットされ、body[data-ready="1"] はスクリーンショット可能を示します。画面上の「Download GLB」ボタンで布を他のエンジンにエクスポートできます。

フロー

ステップ処理内容理由ライブラリ関数
1平面座標で輪郭(四角形)と「縫い目までの距離」を定義縫い目、しわのフェードアウト、角めくりに必要quadEdge
2塊:手動配置の5~10個の楕円、それぞれ高さと角度を持ち、smooth-maxで結合大まかな形状が「布団の状態」を決める。ノイズでは表現できないmakeLobes lobesAt
3長い折り目:2~3組の方向性のあるbillowノイズ、領域に応じて方向を変える布団の折り目は引っ張られる方向に沿うfoldFamily
4垂れ下がる部分に縦方向の波;全体にdomain warp;soft capで高さ制限垂布は平らではない;定規で描いたような直線を避ける;一番高い塊を誇張しすぎないsoftCap
5ピーク削減:各点の高さは(2回ぼかした)周囲より約1.2cm以下に抑え、谷は鋭く保つ中綿入りの布には尖ったピークがない;これで「山」から「布団」になるField.erodePeaks
6しわを一本ずつ描画:クランプ点から扇状に放射、その他はテンションフィールドに沿って分散、平坦領域と縫い目付近で減衰ノイズでしわを作ると大理石の模様のようになる。「テント形断面」の線分が必要CreaseSet crease
7縫い目:平らな帯、ステッチの溝、縮みエッジは実在の幾何であり、近づいても信頼できる必要があるサンプル hemElev
8サポートにラップ:平坦領域+角丸+垂直下方向一枚の平面でベッド上とベッドサイドを同時に表現できるboxSupport
9高い折り目を片側に倒す:倒す距離はその場所の高さに依存膨らみは片側が急で片側が緩やかになり、対称な饅頭のようにはならないサンプル place
10角めくり:折り線を超えた部分をまず円筒に沿って巻き上げ、次に布団の上に平らに置く;押さえられた領域は平坦領域に設定ストーリー性のあるディテールを追加curl
113D曲面に従ってUVを平坦化(マルチグリッド、エッジ長制約)急な折り目でプリントが伸びないようにするrelaxUV uvStretch
12マテリアル:繰り返し可能な細かいしわの法線マップ(alphaに空洞マップ)+プリント+sheenジオメトリはcm単位、テクスチャはmm単位wrinkleTexture sprigPrintTexture cottonMaterial

必ず守ること

  1. 乱数は必ず RNG(seed)/pn(...,seed) を使い、Math.random() は使用しない。 スクリーンショットの回帰テスト、ベイクドライティング、多人同期はこれに依存する。
  2. 大きな形状は3次補間でサンプリング(Field.cubic)、しわはバイリニア(Field.bil)。 大きな形状にバイリニアを使うと、メッシュ上に5mmの格子面が見える。
  3. しわをノイズで作らない。 ノイズは塊状になる;実際のしわは方向性があり、両端が細くなる線。
  4. 先にピーク削減、その後しわを追加。 順序が逆だと、しわの稜線も削られてしまう。
  5. 角めくりの下の平坦領域は、めくられた範囲全体をカバーする必要がある(サンプルでは QMAX で自動計算)。カバー不足だと、めくられた部分が高い塊の上に重なり、模様が帯状に伸びる(実際に発生、詳細は references/verification.md)。
  6. UV平坦化は「めくる前」の形状 U に対して行う。 めくられた部分の伸びは別途チェックする。relaxUV はグリッド数が8の倍数であることを要求する。
  7. 垂布は下のものに衝突してはならない: サンプルではベッドフレームをマットレスより狭くしている。サポート以外の衝突はこの手法の対象外。
  8. 隣接する2辺が同時に垂れる場合、コーナーにはテーパーまたは三角布が必要になるが、boxSupport は処理しない。 対向する2辺のみを垂らすこと。

数値の出発点(サンプル実測)

  • 布団の平置き厚さ 5cm、塊の高さ × LOBE_SCALE(0.3 は普通に寝た跡、1 は大きく盛り上がった状態)、最高 soft cap 23cm。
  • 長い折り目の間隔約 12cm、長さ約 60cm、振幅 3–4cm;ピーク削減半径 5 セル(2.5cm)、上限 1.2cm。
  • しわの幅 2.4–4cm、高さは幅の約 0.16–0.3 倍、30% は溝;各クランプ点から 4–7 本、他に 200 組を分散配置。
  • メッシュ約 7mm(288×192)、約 13 万トライアングル、モデリング時間約 0.45秒(うち UV平坦化約 0.15秒)、貫通 0、UV伸び p5/p95 約 0.92/1.08。

カーテン(吊り下げられた布)

布団の手法は「高さ場をサポートにラップする」ですが、カーテンには適用できません。カーテンでは、各水平断面は長さが固定された線であり、布に沿って進行角度 θ(s) を積分して描画し、二分法で θ の倍率を調整して、その列がその高さでの必要な幅にちょうど一致するようにします。布は伸びないため、UVは直接メートル単位で、テクスチャの変形はありません。詳細は 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 が 0 であること;stretchP95Pct が 1 未満であること
  • サンプル実測:1枚約10万トライアングル、0.2秒で構築、伸び p95 は 0.4–0.7 %、交差 0。
  • 注意:depth を締めすぎると、布が 5–15 % 短くなる。スペースが足りない場合は fullness を下げ、深さを押さえないこと。
  • 注意:裾を狭くしすぎると、折り目同士が貫通することがある。しきい値はシードに依存する(サンプルの右パネルでは約 0.67 倍でも交差あり、0.79 倍で合格)。crossings を確認し、必要に応じてシードを変更すること。
  • デフォルトの depth [-0.11, 0.16] では布は短くならないが、竿は壁から約 12cm 離す必要がある。

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

関連スキル