CommunityImagemgithub.com

threejs-procedural-textures

Gere texturas fotorrealistas proceduralmente em three.js (sem usar nenhum arquivo de imagem): ruído contínuo, mapas normais a partir de campos de altura em milímetros, rugosidade e oclusão ambiental empacotadas, texturas via Canvas2D, albedo médio (para烘培 de iluminação) e verificação de emendas. Inclui texturas prontas: papel de parede de laca com variação de gesso e tinta em grande escala, casca de laranja em pintura, rugosidade de toque, acúmulo de poeira, piso de carvalho (com emendas alternadas, textura única por tábua, nós, chanfros sutis nas bordas), veios de madeira genéricos, folheado de carvalho, tecido plano, waffle, toalha felpuda, canelado, malha, feltro, corda de algodão, desgaste (poeira, gordura, digitais, detritos, fiapos, cabelos, marcas de copo, arranhões finos, desenhados simultaneamente em cor e rugosidade), esmalte manchado, arranhões em pintura em pó, atlas de capas de livros com geometria de livro com UV correspondente, bordas de páginas, pôster de mapa topográfico, foto, texto falso. Use quando o usuário disser "gerar textura procedural", "textura procedural", "material sem arquivo de imagem", "como gerar normal map", "textura de piso/madeira", "parede parece falsa", "textura de tecido", "normal map de malha/toalha felpuda", "desgaste", "arranhões/digitais/poeira", "mapa de rugosidade", "capa/lombada de livro", "texto falso", "textura com emendas visíveis", "desenhar textura no Canvas".

O que é threejs-procedural-textures?

Esta skill oferece um conjunto abrangente de funções para gerar texturas proceduralmente no three.js, sem depender de nenhum arquivo de imagem externo. Ela é extremamente útil para desenvolvedores que desejam criar cenas 3D realistas com recursos mínimos, garantindo que todas as texturas sejam reproduzíveis, repetíveis (tileable) e fisicamente precisas, com alturas em milímetros e UVs em metros. A biblioteca suporta a geração de mapas de cor, normal, rugosidade e oclusão ambiental, além de texturas de desgaste, tecidos, pisos, madeiras, capas de livros e texto falso. Ela funciona inteiramente em JavaScript para three.js, com funções exportadas que podem ser importadas e usadas diretamente em qualquer cena. A skill prioriza a eficiência, com texturas sendo geradas em milissegundos e cacheadas para reuso, e fornece ferramentas para verificar emendas (seamScore) e calcular o albedo médio para烘培 de iluminação. Ela é uma adaptação do projeto open-source room-at-dawn e inclui documentação detalhada e um exemplo prático.

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

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

Texturas Procedurais em three.js

Origem: room-at-dawn (MIT), extraído de src/core/tex.js, rng.js, src/scene/materials.js e das funções de material em parts/. No quarto original, não havia nenhum arquivo de imagem; todas as texturas eram geradas proceduralmente no carregamento.

Ideias centrais:

  1. Projete com unidades físicas. Alturas em milímetros, UV em metros. repeat = 1 / tileEmMetros; mudar a resolução não altera a aparência.
  2. Grande parte do "realismo" está na rugosidade, não na cor. Digitais, marcas de limpeza, poeira são quase invisíveis na cor; só aparecem quando a luz especular passa.
  3. Tudo deve ser repetível e reproduzível. Ruídos têm período; números aleatórios sempre usam RNG(seed). O mesmo seed sempre produz o mesmo resultado (essencial para烘培 de iluminação e testes de screenshot).

Arquivos

CaminhoConteúdo
scripts/tex.jsBásico: RNG, pnoise/pfbm (período diferente por eixo), worley, vn (ruído rápido com lookup table), field, normalBytes (em milímetros), dataTex/canvasTex/packTex/colorTex, avgColor, once (cache), rep (compartilhar imagem, só mudar repeat), seamScore, texData
scripts/surfaces.jswallNormal + wallPatch (papel de parede de laca com variação de gesso e tinta em escala de 3.2 m), lacquerNormal, smudgeRough, dustRough, floorMaps, woodMaps, oakVeneer
scripts/textiles.jsweaveNormal, waffleNormal, terryNormal, ribNormal, knitNormal, feltNormal, ropeNormal, fabricMaterial (sheen com透光 contraluz)
scripts/wear.jswornMaps (uma superfície inteira usada: duas telas de cor e rugosidade), speckleTexture, scuffTexture, e pincéis básicos softBlob, strand, fingerprint, noiseTile, overlay
scripts/print.jsword/phrase (texto falso feito com sílabas), PAL, packer, fitText, paperGrain, makeBook + bookAtlas + bookGeometry, pagesTexture, topoPoster, photoPrints
example/Um canto de sala, cada superfície usa um material da biblioteca. ?cam= (room, desk, glint, fabric, floor, wall, books); ?flat=1 para alternar para cor sólida
example/preview.jpgScreenshot do exemplo
references/recipes.mdComo cada material é feito: tamanhos, parâmetros e como adicionar novos
references/verify-engines.mdMétodos de verificação, problemas encontrados, desempenho e portabilidade para Godot/Unreal

Executar o Exemplo

cd <pasta_da_skill> && python3 -m http.server 5422 --bind 127.0.0.1
# Abra http://127.0.0.1:5422/example/   (window.__tex contém tempo de geração, seamScore e albedo médio de cada textura)

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

Uso

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 em metros; repeat já configurado
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 });
  • Materiais com roughnessMap devem ter roughness definido como 1. O three.js multiplica ambos.
  • A rugosidade em packTex e wornMaps está no canal G; canvas em escala de cinza também pode ser usado diretamente.
  • Cada material retorna avg (cor linear média) para uso como albedo de luz refletida em threejs-baked-gi.

Regras Obrigatórias

  1. Não use Math.random(). Cada textura deve ter um seed fixo.
  2. O período do ruído deve ser um número inteiro e alinhado com a grade da textura (ex.: pfbm(u*6, v*6, oct, seed, 6)). Caso contrário, haverá emendas. Use seamScore para verificar.
  3. Alturas em milímetros, use normalBytes(H, w, h, mm_por_tile). Ao mudar a resolução, a intensidade do relevo não muda; algumas texturas não têm tiles quadrados (piso 1.1 × 1.9 mm), então os eixos devem ser fornecidos separadamente.
  4. Desenhe rugosidade junto com a cor. Cada traço em wornMaps é desenhado em ambas as telas simultaneamente, usando o mesmo new RNG(i), garantindo que as formas fiquem alinhadas.
  5. Em superfícies escuras, reduza detritos e pontos brilhantes (no exemplo, a mesa escura foi de 9000 para 2500), caso contrário, parecerá granito.
  6. Texto e padrões desenhados no Canvas devem ser gerados pela própria biblioteca (word(), formas geométricas); não use nomes reais de livros, marcas ou logotipos.
  7. A maior textura (2048²) leva 0,1–0,35 segundos para ser criada. Use once para cache e rep() para compartilhar a mesma imagem. Não gere para cada objeto individualmente.

Benchmarks (RTX 4090, Chrome headless, cena de exemplo 1.1 s)

TexturaResoluçãoTempoSeamScore (x/y)
floorMaps2048² × 3 texturas0.32 sCor 0.96/1.10, Normal 1.00/1.02, Rugosidade 0.89/1.05
woodMaps1024² × 30.20–0.23 sCor 0.93/1.12, Normal 1.30/1.06
wornMaps (1.2 × 0.6 m, 3400 px/m)4080×2040 + rugosidade com metade do tamanho0.13 sNão repetível
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 tipos de tecido128²–512²1–19 ms0.94–1.10 (y da corda de algodão é 2.03, é um sulco proposital, veja verify-engines.md)
bookAtlas (12 livros)2048×15360.05–0.08 s—

SeamScore ≈ 1 significa que as emendas são imperceptíveis; > 2 requer inspeção. O cálculo adiciona 1 nível de cor ao numerador e denominador para evitar que direções com pouca variação (como veios retos de madeira) produzam valores grandes devido a ruído abaixo de 1 nível de cor.

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

Habilidades Relacionadas