Files
animation/characters/female/lena_nude/HANDOFF_reatlas_v02.md
T
jeremy 3ba86b2ea8 feat: clothing lane, character sources, and DCC bridges
Bulk import of the working lanes that were living untracked on the PC.

Content:
- characters/  Lena/male body lanes, bakes, texture work, run logs
- clothing/    garment pipeline, configs, gates, contract docs
- garments/    MD-authored garment sources (.zprj/.zpac)
- UAL-Lib/     Universal Animation Library 2 source (.blend/.fbx/.glb)
- tools/       blender_bridge, iclone_bridge, md_bridge, tailor, glm_agent
- docs/, plans/, dev/, .agents/plans/

Repo hygiene:
- .gitattributes: LFS now covers .blend, .zprj, .zpac, .obj, .npy and the
  Reallusion .iAvatar/.ccAvatar/.ccRestore containers. Without this the
  ~3.8 GB in this commit would land as raw blobs. .png/.jpg are left out
  on purpose — ~250 are already tracked raw and converting them would
  rewrite every one without shrinking history.
- .gitignore: exclude /accurig/ (~1 GB AccuRig program files, redistributable
  from Reallusion, nothing authored here) and /dev/null/ (git-lfs hook copies
  dropped by a `>/dev/null` redirect on Windows).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 15:55:43 -07:00

88 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.