mesh-avatar-studio
일러스트를 코딩 에이전트와 로컬 편집기로 2D 메쉬 애니메이션 아바타로 변환
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A browser-based design space explorer for implicit metamaterials. Sweep hundreds of geometric configurations in parallel, rank them by mechanical or thermal performance, and export the best candidates for validation.README 전문 보기 ↗A browser-based design space explorer for implicit metamaterials. Sweep hundreds of geometric configurations in parallel, rank them by mechanical or thermal performance, and export the best candidates for validation.
Companion to the F13LD Suite
f13ld.sweep takes an implicit recipe (exported from other f13ld tools) and explores the surrounding design space — varying multiple parameters depending on the type and surface modes. Each candidate design is evaluated using a browser-based FFT-CG homogenization solver that computes effective elastic stiffness, anisotropy, connectivity, pore geometry, and optional thermal conductivity. Results are ranked, visualized in a 3D design space explorer, and exportable as JSON for downstream GPU validation.
| Symbol | Metric | Description |
|---|---|---|
| α | Anisotropy ratio | Strongest vs. weakest stiffness axis |
| E/ρ | Stiffness / Density | Mean stiffness per unit material volume |
| α/ρ | Anisotropy efficiency | Directional bias per unit material |
| Ξ | Axial dominance | Peak axis vs. the other two combined |
| Ω | Orthotropic contrast | Spread across all three stiffness axes |
| λ | Load path efficiency | Peak E / (ρ × E_solid) — pure geometry efficiency |
| κ | Connectivity index | Geometric fraction of axes that span periodically (0, 0.33, 0.67, or 1.0) |
| Ex / Ey / Ez | Directional stiffness | Effective Young's modulus per axis (GPa) |
| kx / ky / kz | Thermal conductivity | Effective conductivity per axis (W/m·K) |
| kα | Thermal anisotropy | Max vs. min directional conductivity |
| k/ρ | Thermal / Density | Mean conductivity per unit material volume |
| U | Strain energy density | Mean strain energy under reference stress (kJ/m³) |
| με | Microstrain | Strain per axis under reference load |
| φ | Mean pore size | Inscribed sphere diameter (µm) |
| φt | Throat diameter | Narrowest pore connection (µm) |
| perc | Void percolation | Fraction of axes with open pore channels |
Selecting a domain picks the table's columns (at most 8: volume fraction, the rank metrics, then the domain's key metrics — every metric is still computed, exported, and listed in the row detail panel), sets domain-appropriate rank defaults, and constrains the material selector to relevant alloys and polymers.
| Domain | Default Material Options | Primary Rank Default |
|---|---|---|
| General | — (agnostic) | User defined |
| Biomedical | Ti6Al4V, PEEK, SS316L, HA Ceramic | Microstrain → pore size → throat size |
| Aerospace | Ti6Al4V, Al 7075, Inconel 718, CFRP | Load path efficiency → anisotropy → VF |
| Oil & Gas | SS316L, Inconel 625, Tool Steel | Connectivity → isotropy → stiffness density |
| Automotive | Al 6061, HSLA Steel, Nylon PA12 | Ortho contrast → stiffness density → VF |
| Thermal | Copper, Al 6061, Ti6Al4V | Thermal/density → thermal anisotropy → connectivity |
Three sequential rank filters narrow the design space:
After sequential filtering, remaining designs are ranked by one of two modes:
The canvas in the upper right plots all surviving designs as a 3D scatter. Axes map to the three rank filter metrics. Click and drag to rotate. Hover a point to preview its surface and highlight the corresponding table row. Click to select for export.
Color modes:
Since v0.24.0 Sweep solves on the GPU with F13LD.lab's own WebGPU solver whenever the browser has WebGPU, and falls back to its older CPU solver otherwise. The sidebar's Solver line says which one is running (GPU and adapter name, or CPU and why).
solver/lab/ holds Lab's solver files byte-for-byte (FFT, the fast elastic path, the thermal solver; tests/parity/solversync.js checks them). They run in their own worker (solver/gpu-worker.js), so the page stays responsive.cell_scale_x/y/z, beam scale_xyz) is solved as stretched — the voxel spacing differs per axis in the Green operator and the thermal operator. Before v0.24.0 cell scale did not change the physics. (F13LD.lab still solves cubic cells; it will take this up later.)?gpu=0 to the URL for the CPU solver.tests/bench.html (solver checks and a CPU-vs-GPU speed bench on real sweeps).The fallback is a browser-native FFT-CG (Fast Fourier Transform – Conjugate Gradient) solver based on the Lippmann-Schwinger formulation. It computes effective elastic stiffness by solving three independent normal load cases on a voxelized unit cell, extracting Ex, Ey, Ez from the compliance tensor inverse.
r ≈ 0.1 cell units) are roughly one voxel wide at N=32 — the solver still produces stable stiffness values at that resolution, but binary voxel counting for volume fraction is alignment-noise dominated. Hi-res sampling resolves pipes with ~3 voxels across, giving reliable geometric measurements without paying the ~10× cost of running the FFT-CG itself at higher N.Sweeps run on a Web Worker pool sized to min(8, navigator.hardwareConcurrency − 1) — leaves one core for the UI, caps at 8 to avoid thermal throttling on laptops. The pool persists across sweep runs in the same tab session, so subsequent sweeps don't pay worker startup latency.
Each worker loads worker/sweep-worker.js, which pulls in the same family, solver and metrics files the page uses (importScripts), so every worker has its own copy of the solver, workspace and Gamma cache. (Before v0.20.0 the worker source was assembled at runtime from Function.prototype.toString().)
Sample generation (Sobol low-discrepancy: dimension 0 the density, 1–3 the cell scale, then each family's most influential settings; a seeded random stream for the rest) stays on the main thread; the worker solves each design's density knob first (41-density.js) and sends the solved recipe back — workers receive fully-realized design specs and dispatch results back via attemptIdx. Final result IDs are assigned by sorting on attemptIdx after the sweep completes, so results are deterministic across runs with the same Sobol seed regardless of worker completion order.
Connectivity (κ) is computed geometrically via breadth-first search through solid voxels with periodic boundary conditions. Each voxel records the image offset at which it was first reached; when BFS revisits a voxel via a different image, the difference vector is recorded as a span vector. An axis counts as connected if any span vector has a nonzero component along that axis. This replaces the prior stiffness-threshold proxy, which incorrectly reported κ=1 for any design that produced nonzero Ex/Ey/Ez under periodic boundaries — including disconnected fragments coupled only through their image.
After random sampling, all per-term coefficients are normalized to max(|c|) = 1. This decouples the geometric parameters (pipe_radius, wall_thickness, offset) from the random coefficient scale, so a given pipe radius means the same physical thing across every sample draw. Without normalization, large coefficient ratios produce field magnitudes ~10–15, making typical pipe radii hair-thin slices of field space and pushing most attempts into degenerate-VF rejection.
The Green operator Γ is precomputed once per worker per (N, Es, ν) triple and held for the duration of the sweep. Workers also reuse a pre-allocated SolverWorkspace (FFT line buffers, CG residual/direction arrays) across all designs they handle, avoiding per-sample Float32Array allocation churn.
Optional scalar FFT-CG thermal solve (three flux load cases) activates only in the Thermal domain. Reuses the elastic solve's voxel field — no additional voxelization cost.
All hot-path arrays (stress, strain, residual, search direction) are Float32. Γ and FFT line buffers stay Float64 for spectral accuracy. End-to-end drift versus pure Float64 is on the order of 10⁻⁶ relative, well below the rounding precision of reported metrics.
The sweep samples PI-TPMS phase shifts from discrete eighths along each axis, excluding the trivial (0, 0, 0) shift (which collapses the two surfaces into one and produces a sheet rather than a pipe network). Other shifts that may be degenerate for specific surface families — e.g. (0.5, 0.5, 0.5) for surfaces with frequency-2 term structure — are not currently filtered. If a degenerate combination produces a near-empty design, the volume-fraction threshold catches it as a regular discard. A formal degenerate-shift library, indexed by surface family, is on the roadmap.
Since v0.20.0 the tool is split into numbered classic scripts, like F13LD.lab and F13LD.mesh. They share one global scope and load in numeric order. No build step; serve over http(s) (GitHub Pages does) — file:// can't start workers.
| File | Contents |
|---|---|
index.html · sweep.css | Markup · all styles |
00-config.js | Tool version (F13LD_SWEEP_VERSION) |
01-f13-shade.js | Shared F13LD-SHADE / F13LD-VIEW blocks (byte-identical across F13LD tools) |
05-log.js · 10-state.js | Run log · global sweep state |
11-rank.js · 12-target-profile.js | Rank filters, KNN outliers, k-means colouring, final ranking · target-aware sampling |
20-recipe-load.js · 21-materials-domain.js · 22-controls.js · 23-dock.js · 24-drawer.js | Recipe loading, presets · materials, domains, pickers · sweep controls · icons, dock + drawer shell, inspector, results funnel, column tooltips · the drawer's Settings panel (drives the hidden legacy controls) (v0.25.0) |
families/fam-index.js · fam-tpms.js · fam-noise.js · fam-grain.js · fam-beam.js · fam-foam.js · fam-wave.js | How each family's recipe is varied (Neighbourhood / Explore, Spread) and summarized |
geom/ | Recipe → field → voxels, byte-identical with F13LD.lab (tests/parity/geomsync.js) |
40-design.js · 41-density.js | Designs are recipes: geometry, voxels, margin field · the density solve (each design's thickness knob set to its drawn volume fraction) |
42-fft.js · 43-elastic-solver.js · 44-solver-config.js · 45-homogenize.js | FFT · Green operator + CG · solver constants and caches · elastic / thermal homogenization |
50-hires-field.js · 51-transport.js · 52-geometry-metrics.js · 53-pores.js | Hi-res field · throat / percolation / tortuosity · curvature / topology · pore analysis |
54-estimate.js | Per-design pipeline: prepareDesign → solve → finishDesign; estimateHomogenization = the CPU path |
The exported JSON contains the full sweep metadata, base recipe parameters, and per-design records including browser FFT-CG estimates and complete term definitions for downstream ingestion into F13LD.vault.
Push to Vault (v0.29.2) sends this same export object (buildResultsPayload in 70-export.js, through a JSON round trip so hashes match an exported file) to f13ld-vault-push.js, loaded from F13LD.ingest (VAULT_PUSH_JS in 00-config.js; ?push=<url> tests another copy). Rows are marked provenance_kind = 'sweep'. Auto-target rounds are never pushed, as they are never exported. tests/vault-push.js checks that the pushed rows equal what Ingest builds from the exported file.
The current sweep tool consumes TPMS recipes only. The next major arc factors the field math into a unified FieldKernel interface that any f13ld field family can plug into. The solver, worker pool, hi-res analysis, and ranking infrastructure are all family-agnostic — the only additions needed are field-evaluation kernels for each new family.
| Stage | Scope |
|---|---|
| E1 | Extract TPMS field math into a unified FieldKernel module. Sweep tool consumes the kernel through the same interface that future families will use. |
| E2 | Add Grain SDF kernel (spinodoid VMF, Gaussian random field, hyperuniform kernel convolution). f13ld.grain recipes become valid sweep inputs. |
| E3 | Add Noise SDF kernel (seven noise types from f13ld.noise). Noise recipes load and sweep. |
| E4 | Family-aware sidebar — sweep parameter UI swaps based on the loaded recipe's family (e.g., grain wavevector parameters replace TPMS pipe radius for spinodoids). |
v0.20.0 split the tool into modules; v0.21.0 builds every design exactly as F13LD.lab and F13LD.mesh do; v0.22.0 fixed the audit's quick items; v0.23.0 refreshed the UI; v0.24.0 moved the solver onto the GPU (F13LD.lab's solver, full 6 × 6 with shear, stretched cells, Lab's thermal). Next: the CPU fallback with the same physics, then the UI session. See docs/NEXT_STEPS.md and docs/REFACTOR.md.
throat_size measures local surface curvature length scale, which is a useful proxy but not the geometric narrowest-channel width.surface_complexity field correction for PI-TPMS mode. The current implementation evaluates the wrong implicit (TPMS solid condition rather than PI-TPMS pipe condition) when counting isosurface faces.MIT (LICENSE), except the solver/ folder: F13LD.lab's solver and the code built on it are under the PolyForm Noncommercial License 1.0.0 with F13LD.lab's permission to reproduce published results (solver/LICENSE.md, solver/NOTICE).
55-estimate-gpu.js | GPU path: prepareDesignGpu (worker: partial volume, island trim, cell edges) · finishDesignGpu (page: moduli from the 6 × 6) · GPU precision settings |
60-solver-pool.js · 61-sobol.js · 62-run-sweep.js | Worker pool, GPU solver client, per-design routing (computeDesign) · Sobol sampler · sweep runner |
70-export.js · 71-results-table.js · 72-mesh-handoff.js | Results export · table and per-domain columns · F13LD.lab / F13LD.mesh handoff |
80-preview-glsl.js · 81-preview-gl.js · 82-design-select.js · 85-scatter-plot.js | Preview shader builders · WebGL preview · design select / export · 3D scatter |
99-init.js | Page init |
worker/sweep-worker.js | CPU worker (loads families/, 40–55): whole designs on the CPU path, design preparation on the GPU path |
solver/ | PolyForm Noncommercial (solver/LICENSE.md, solver/NOTICE). lab/ = F13LD.lab's solver files, unchanged · gpu-worker.js = the GPU worker · sweep-gpu-kernels.js = Sweep's additions (stretched-cell Green operator and thermal scaling) |
tests/ | Dev: old-vs-new regression (harness.js, CPU path), load-order check (loadorder.js), GPU bench (bench.html), stretched-cell CPU check (gpu/stretch-check.js), Lab sync checks (parity/geomsync.js, parity/solversync.js), density landing (density.js), jitter → density → solve without a browser (smoke-jitter.js) |
docs/ | REFACTOR.md (plan, decisions, phases) · AUDIT_v0.19.0.md (findings) |