88 lines
4.5 KiB
Markdown
88 lines
4.5 KiB
Markdown
|
|
# Handoff: re-atlased nude Lena — `lena_nude_decimated_glb_v02.glb`
|
|||
|
|
|
|||
|
|
**2026-08-06.** Jeremy asked for the decimated nude body re-atlased and versioned. This is a
|
|||
|
|
**UV + texture change only**: the geometry is byte-for-byte the v01 mesh.
|
|||
|
|
|
|||
|
|
## The file
|
|||
|
|
|
|||
|
|
`characters/female/lena_nude/lena_nude_decimated_glb_v02.glb`
|
|||
|
|
|
|||
|
|
| | |
|
|||
|
|
|---|---|
|
|||
|
|
| sha256 | `cd3d53550470ae5a1958dc473ce11793f746b13f78ac911e6d426b6f7b9f5825` |
|
|||
|
|
| parent | `lena_nude_decimated_glb_v01.glb` |
|
|||
|
|
| recipe | `hires_claude/24_seams.py` → `hires_claude/31_reatlas.py` |
|
|||
|
|
| mesh | 31,964 v / 64,957 tris in Blender — **identical to v01** |
|
|||
|
|
| exported verts | 42,980 (v01: 46,810) — the new layout needs fewer seam splits |
|
|||
|
|
| maps | basecolor + normal + rm embedded, 4096², JPEG q95, correct colorspaces |
|
|||
|
|
| rig | none — unrigged, transforms applied |
|
|||
|
|
|
|||
|
|
Rebuild:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
blender --background --python 24_seams.py -- ../lena_nude_decimated_glb_v01.glb atlas_v02
|
|||
|
|
blender --background --python 31_reatlas.py -- atlas_v02/seamed.blend atlas_v02 \
|
|||
|
|
../lena_nude_decimated_glb_v02.glb
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## What changed
|
|||
|
|
|
|||
|
|
| | Tripo atlas (v01) | new atlas (v02) |
|
|||
|
|
|---|---|---|
|
|||
|
|
| UV islands | 5,870 | 968 |
|
|||
|
|
| charts holding 99% of the area | 84 | **14** |
|
|||
|
|
| atlas coverage | 62.0% | **68.6%** |
|
|||
|
|
| texel-density spread | 1.8× | **1.00×** |
|
|||
|
|
| per-triangle area-scale p95 / p99 | — | 1.77 / 2.27 |
|
|||
|
|
|
|||
|
|
The 14 charts are torso, head, two arms, two legs, two hands (back + palm each) and two feet
|
|||
|
|
(upper + sole each). Seams run up the back midline, the back of each arm and the inner leg, with
|
|||
|
|
rings at neck, shoulder, wrist, hip and ankle — every landmark measured off the mesh's own
|
|||
|
|
cross-section radius profiles, so the rules port to any density.
|
|||
|
|
|
|||
|
|
**It looks the same, on purpose.** Five matched views diff at mean \|Δ\| 0.0012, p99 0.0118, with
|
|||
|
|
0.19% of body pixels over 0.05 (`33_ab.py`). Her original tones are untouched — this pass bought a
|
|||
|
|
paintable, uniform-density layout, not a new look.
|
|||
|
|
|
|||
|
|
## Three traps this pass hit, so you don't
|
|||
|
|
|
|||
|
|
1. **Colorspace is not cosmetic.** `image.pixels` returns *linear* values for an sRGB image and
|
|||
|
|
*raw* values for a Non-Color one, and re-encodes the same way on save. The normal and rm maps
|
|||
|
|
are Non-Color; writing them into default (sRGB) images gamma-encoded them, so 0.5 came back as
|
|||
|
|
0.21 — every stored normal became a large false perturbation and she rendered dark and
|
|||
|
|
wet-plastic. New maps must inherit `colorspace_settings.name` from their source.
|
|||
|
|
2. **Use the minimum-stretch solver, not angle-based.** ABF is conformal: it preserves angles and
|
|||
|
|
is free to crush area. At her folds it squashed 4,502 triangles (3.7% of her surface) below one
|
|||
|
|
texel, and they came out untextured. `method='MINIMUM_STRETCH'` took per-triangle area-scale p05
|
|||
|
|
from 0.03 to 0.33 and the untextured count from 4,502 to 569 (0.56%, all genuine sub-texel
|
|||
|
|
slivers absorbed by the 16 px padding pass).
|
|||
|
|
3. **Watch the LOW tail of the distortion stat.** p95/p99 measure stretching; it was p05 = 0.03 —
|
|||
|
|
crushing — that was losing whole patches. I read past it twice.
|
|||
|
|
|
|||
|
|
Also tried and rejected: splitting the 1,649 non-manifold edges before unwrapping. It cost +3,512
|
|||
|
|
verts and made the collapsed-face count *worse* (4,502 → 5,482), because the collapse was a solver
|
|||
|
|
problem, not a topology one.
|
|||
|
|
|
|||
|
|
## Still broken, and not from this pass
|
|||
|
|
|
|||
|
|
**The ragged grey tears on the face, across the underbust, and as flecks down the arms and shins
|
|||
|
|
are in v01 already** — I rendered v01 through the same script to confirm, and they are identical in
|
|||
|
|
position and shape (`hires_claude/beauty_input_v01/` vs `beauty_atlas_v02/`). They are the 835
|
|||
|
|
boundary edges / dangling flaps the v01 handoff lists as a known defect. A re-atlas cannot fix
|
|||
|
|
geometry. They need mesh surgery before this body ships.
|
|||
|
|
|
|||
|
|
The other v01 defects carry over untouched: 25 backfacing triangles, the head still being original
|
|||
|
|
Tripo output, and the glossy `rm` map.
|
|||
|
|
|
|||
|
|
## What this does NOT do
|
|||
|
|
|
|||
|
|
Jeremy's stated goal is to **keep her original texture and replace only the breast and underwear
|
|||
|
|
region**. This pass deliberately does not touch colour — it only rehouses it. The re-authoring step
|
|||
|
|
(a gradient-domain fill pinned to her surrounding skin at the boundary, so the old bra/briefs
|
|||
|
|
outline cannot ghost) is the next stage, and it is much easier now that the charts are anatomical
|
|||
|
|
and uniform-density.
|
|||
|
|
|
|||
|
|
Note that keeping her original texture keeps its known incoherence: her feet read 0.11 luma darker
|
|||
|
|
and 50% redder than her belly, and the rosy chest V remains. Measured in
|
|||
|
|
`hires_claude/21_seam_probe.py`; see the `lena-tripo-atlas-chart-soup` note.
|