Community画像github.com

threejs-procedural-textures

Three.js で写真級のテクスチャをプログラムでリアルタイム生成(画像ファイル不要)。シームレスなノイズ、ミリ単位のハイトフィールド→ノーマルマップ変換、ラフネス・AOパッキング、Canvas2D→テクスチャ変換、平均アルベド(ライトベイク用)、シームチェックなどを備えます。

threejs-procedural-textures とは?

このスキルは、Three.js アプリケーションで使用するフォトリアリスティックなテクスチャを、画像ファイルを一切使わずに JavaScript コードでリアルタイム生成するためのライブラリです。すべてのテクスチャは物理単位(ミリメートル)で設計されており、解像度を変えても外観が変わりません。ノイズ関数はすべて周期が整数でタイル数と揃っているためシームレスに繰り返し可能で、乱数はシード値ベースの `RNG` を使うため完全に再現可能です。壁紙、木目、布地、摩耗痕、本の背表紙、ステッカーなど多様なマテリアルをカバーし、特にラフネスマップに重点を置いて指紋やホコリ、擦り傷などの細かな質感を表現します。生成時間は最大テクスチャ(2048²)でも 0.1–0.35 秒と高速で、さらに `once` キャッシュと `rep` 共有によりオブジェクトごとの再生成を防ぎます。スキルは `tex.js` をコアに、`surfaces.js`(壁・床)、`textiles.js`(布地)、`wear.js`(摩耗)、`print.js`(テキスト・本)などのモジュールで構成され、デモ用の `example/` フォルダも付属します。開発者は Three.js の `MeshStandardMaterial` などと組み合わせて、`map` `normalMap` `roughnessMap` を即座に生成・適用できます。

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

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

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

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

ドキュメント

プログラム生成テクスチャ

出典:room-at-dawn(MIT)、src/core/tex.js・rng.js・src/scene/materials.js、および parts/ 以下の各パーツのテクスチャ関数。 元のプロジェクトの寝室には画像ファイルが一つもなく、すべてのテクスチャを読み込み時にプログラムで生成しています。

核となる考え方:

  1. 物理単位で設計する。 高さはミリメートル単位、テクスチャの1グリッドが何メートルに相当するかを明記し、UV もメートルで指定します。これにより repeat = 1 / tileメートル となり、解像度を変えても見た目が変わりません。
  2. 「リアルさ」の大部分は色ではなくラフネスに現れる。 指紋、拭き跡、ホコリは色ではほとんど見えず、ハイライトが当たって初めて現れます。
  3. すべて繰り返し可能かつ再現可能。 ノイズはすべて周期を持ち、乱数は一律 RNG(seed) を使うため、同じシードからは常に同じ結果が得られます(ライトベイクやスクリーンショットの回帰テストに重要)。

ファイル

パス内容
scripts/tex.js基本:RNG、pnoise/pfbm(軸ごとに異なる周期可能)、worley、vn(ルックアップテーブルによる高速ノイズ)、field、normalBytes(ミリメートル単位)、dataTex/canvasTex/packTex/colorTex、avgColor、once(キャッシュ)、rep(画像共有・repeatのみ変更)、seamScore、texData
scripts/surfaces.jswallNormal+wallPatch(木くず壁紙に3.2mスケールの漆喰と塗装の変化を加えたもの)、lacquerNormal、smudgeRough、dustRough、floorMaps、woodMaps、oakVeneer
scripts/textiles.jsweaveNormal、waffleNormal、terryNormal、ribNormal、knitNormal、feltNormal、ropeNormal、fabricMaterial(sheen+逆光透過)
scripts/wear.jswornMaps(使い込まれた表面全体:色とラフネスの2枚)、speckleTexture、scuffTexture、および基本ブラシ softBlob、strand、fingerprint、noiseTile、overlay
scripts/print.jsword/phrase(音節から生成されるダミーテキスト)、PAL、packer、fitText、paperGrain、makeBook+bookAtlas+bookGeometry、pagesTexture、topoPoster、photoPrints
example/部屋の一隅。すべての面がライブラリのいずれかのマテリアルを使用。?cam=(room、desk、glint、fabric、floor、wall、books);?flat=1 で単色比較モード
example/preview.jpgサンプルスクリーンショット
references/recipes.md各マテリアルの作り方・サイズ・パラメータ、および新しいマテリアルを追加する方法
references/verify-engines.md検証方法、遭遇した問題、パフォーマンス、Godot/Unrealへの移植について

サンプルの実行

cd <skill ディレクトリ> && python3 -m http.server 5422 --bind 127.0.0.1
# ブラウザで http://127.0.0.1:5422/example/ を開く (window.__tex に各テクスチャの生成時間・シームスコア・平均アルベドが格納されます)

(<skill ディレクトリ> はこのスキルを読み込んだときに表示される Base directory です。プラグインとしてインストールした場合、~/.claude/plugins/cache/ 以下に配置されます)

使い方

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はメートル単位。repeatは自動設定済み
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 });
  • roughnessMap を使用するマテリアルでは、roughness を 1 に設定してください。Three.js は両者を乗算します。
  • packTex と wornMaps のラフネスは G チャンネルに格納されます。グレースケールの canvas もそのまま使用できます。
  • 各マテリアルは avg(線形平均色)を返します。これは threejs-baked-gi で反射光のアルベドとして使用します。

必ず守ること

  1. Math.random() を使ってはいけません。 すべてのテクスチャに固定のシードが必要です。
  2. ノイズの周期は整数で、テクスチャのタイル数と揃っていなければなりません(例:pfbm(u*6, v*6, oct, seed, 6))。揃っていないとシームが発生します。seamScore で確認してください。
  3. 高さはミリメートル単位で、normalBytes(H, w, h, 1グリッドあたりのミリメートル数) を使用します。 解像度を変えてもバンプの強さは変わりません。また、床(1.1×1.9 mm)のようにグリッドが正方形でない場合は、軸ごとに別々の値を指定してください。
  4. ラフネスは色と一緒に描画します。 wornMaps では各ストロークを2枚の canvas に同時に描画し、同じ new RNG(i) を使用して2枚の形状を合わせます。
  5. 暗い表面では、ゴミや明るい点の数を減らします(サンプルの濃い色の机では 9000 から 2500 に削減)。減らさないと花崗岩のように見えます。
  6. Canvas に描画するテキストや図形はすべて自作します(word()、幾何図形)。実際の書名、ブランド名、商標を使ってはいけません。
  7. 最大サイズのテクスチャ(2048²)の生成には 0.1–0.35 秒かかります。 同じテクスチャは once でキャッシュし、rep() で共有します。オブジェクトごとに再生成しないでください。

実測値(RTX 4090、Chrome headless、サンプル全体で 1.1 秒)

テクスチャサイズ時間シームスコア (x/y)
floorMaps2048² × 3枚0.32 s色 0.96/1.10、法線 1.00/1.02、ラフネス 0.89/1.05
woodMaps1024² × 30.20–0.23 s色 0.93/1.12、法線 1.30/1.06
wornMaps(1.2×0.6 m、3400 px/m)4080×2040+半分サイズのラフネス0.13 s非繰り返し
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種128²–512²1–19 ms0.94–1.10(綿ロープのyは2.03、意図的な溝。verify-engines.md参照)
bookAtlas(12冊)2048×15360.05–0.08 s—

シームスコアが約1であればシームが見えず、2を超える場合は確認が必要です。計算時、分子と分母にそれぞれ1階調を加えることで、木目などほぼ変化のない方向で1階調未満のノイズにより大きな比が算出されるのを防ぎます。

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

関連スキル