c12c4f156c
The v02 chain, which exists because bisecting the shard-eye defect proved it lives in
the hires MASTER rather than in any v02 step: the early heal chain ran whole-mesh welds
and reset custom split normals, and the eye/lash shells only read as an eye through
Tripo's authored normals. Every descendant inherits it, including the shipped body.
48_decimate_headsafe body/hands only, head bit-identical (feathered ramp)
49_seams_v02 24_seams with a density-aware hip landmark — the v01 rule fired
at u=0.610, mid-belly, on the head-protected vert count
50_seams_headuv body-only unwrap; the head KEEPS its original Tripo charts.
SLIM collapsed the undecimated lash/brow slivers to points and
ANGLE_BASED packed at half v01's texel density; the face was
the best-mapped region of the source atlas, so it is reused
51_reatlas_v02 31_reatlas + centroid splats for sub-texel triangles — the
skipped set IS the lashes, which rendered as grey glass
52_head_transplant the PRISTINE ORIGINAL head onto the decimated nude body
53_rig_transfer 54_crotch_refill
55_fullres_v02.blend is pinned in .lanekeep as THE archival master: full-res nude body
+ pristine original head, crotch refill and texture despeckle applied, 883,404 v /
1,761,640 f. It supersedes 34_v04 as the lane root (34_v04's head has the shard eyes).
Also: tools/graft_hands.py, the Marvelous Designer hunter-skirt configs v1-v8, the
hunter cloth texture generator, and Mako's measurement card.
Per .agents/rules/working-files.md the per-attempt .blend files under work/lena/v02
are SCRATCH ("never committed") — the .py recipes here are the history and regenerate
any of them from the pinned master. See the ignore rule landing next.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
340 lines
12 KiB
JSON
340 lines
12 KiB
JSON
{
|
|
"name": "hunter_skirt_v8",
|
|
"_worksheet": {
|
|
"block": "aline_skirt (generated), panel outline then hand-shaped",
|
|
"reference": "male-clothing-hunter-gpt-v2{,-side,-back}.png",
|
|
"measured_targets": {
|
|
"waist_top_m": 1.075,
|
|
"solid_hem_m": 0.685,
|
|
"fray_tips_m": 0.65,
|
|
"method": "garment band located by warm-dark mask in all 3 reference views, expressed as fraction of figure height (back 0.598/0.373, side 0.610/0.396), averaged and projected onto Lena's 1.777 m",
|
|
"flare_measured": 1.38,
|
|
"flare_used": 1.45,
|
|
"flare_note": "reference flares 1.38 (widths 98->134 px back, 102->142 px front); raised to 1.45 because 1.38 clears Lena's 109.5 cm hip by only 2.7 cm and a binding hem rides up"
|
|
},
|
|
"why_shaped": "v1 and v2 both failed in SIMULATION while their pre-sim snapshots were clean, which is what proved the pattern and arrangement were right. The straight-sided trapezoid takes its waist from 0.91 x HIP (99.6 cm), but at z=1.075 Lena measures only 71.5 cm -- 28 cm of surplus. v1 (no elastic) slid to the crotch and folded inside out; v2 cinched it with elastic but only at frame 250, by which time the surplus had already buckled into a flap that flipped through itself. Lena's 42 cm hip-to-waist drop over 13 cm of height is the root cause: no straight-sided cone can both grip a 71.5 cm waist and clear a 109.5 cm hip (it would need a 209 cm hem). A curved side seam solves it the way real tailoring does.",
|
|
"ease_profile_cm": {
|
|
"waist_z1.075": -3.5,
|
|
"z1.010": 5.0,
|
|
"hip_z0.945": 6.1
|
|
},
|
|
"hem_circ_cm": 126.0,
|
|
"silhouette_note": "hem/waist ratio is 1.85 vs the reference's measured 1.38. The extra fullness is forced by Lena's hips, not a drafting choice -- the same garment on the male reference body hangs nearly straight.",
|
|
"seam_pairing_discovery": "CROSS-PAIRED sides, front RIGHT <-> back LEFT: [(1,7),(2,6),(3,5),(7,1),(6,2),(5,3)] with (False, False). Established by a 4-cell sweep with the failing case as control (scratchpad/seams/seam_sheet.png): same-index (True,True) -- the rule in the marvelous-designer skill and what blocks.py emits -- COLLAPSES this panel, and so does same-index (False,False). Both cross-paired variants hold. The skill's rule ('identical panels need (True,True) on same-index sides') is derived from a trapezoid whose side is a SINGLE edge; reversal emulates mirroring there. With a 3-segment shaped side seam it does not, and the unrolled-cylinder truth takes over: front spans 0-180 deg and back 180-360, so front's right edge meets back's LEFT.",
|
|
"failure_history": "v1 no elastic: slid to the crotch, folded inside out. v2 elastic at frame 250: too late, surplus had already buckled. v3 shaped panel but negative waist clearance: solver ejected the penetrating cloth, blew up by frame 20 in BOTH stiff and soft (that symmetry is what ruled out fabric stiffness). v4 clearances fixed but still collapsed -> isolated to seam pairing. Every failure had a CLEAN pre-sim snapshot, which is what kept pointing away from the pattern and at the sim.",
|
|
"seam_pairing_SOLVED": "CROSS-paired sides with EXACTLY ONE SIDE REVERSED: reverse_a=False, reverse_b=True on [(1,11),(2,10),(3,9),(4,8),(5,7),(11,1),(10,2),(9,3),(8,4),(7,5)]. Two things had to be right and they are independent. (1) WHICH edges pair: the panels are identical, not mirrored, so front spans 0-180 deg and back 180-360 -- front's RIGHT edge meets back's LEFT. Same-index pairing (what blocks.py emits, and what the skill states for identical panels) collapses this garment in BOTH parities. (2) WHICH DIRECTION: front's right segments run downward (waist->hem), back's left segments run upward, so (False,False) sews every segment's top to its partner's bottom and (True,True) flips both and is EQUIVALENT -- that is exactly why sweep cells C and D were indistinguishable. Reversing one side makes waist-end meet waist-end. Verified stable frames 0-260 with no roll-up, twist or inversion.",
|
|
"strengthen_note": "strengthen=False. On this garment SetPatternStrengthen appears to INFLATE rather than merely stiffen: the strengthened cell balloons, its hem curls into a roll and it loses ~24 cm of length, converging to that shape by frame 40 and holding it. The soft cell reads correctly. The skill's 'strengthen through the whole settle' rule is for garments that must wrap on from a loose arrangement; this one is drafted to fit and materialises already in place, so it does not need it.",
|
|
"elastic_note": "No elastic. The waist is 72 cm against a 68.8 cm body (+3.2 cm) and 48.5 cm smaller than the widest body point (120.5 cm at the thighs), so it physically cannot slide down -- tension holds it, which is the doctrine's actual intent. Elastic was tried and was not the fix for any failure mode.",
|
|
"qc_measured": {
|
|
"command": "python tools/tailor/qc_placement.py <front.png> --json --colors 92,69,54 110,82,64 82,62,48 --tol 20",
|
|
"mask_note": "The garment renders at b/r ~0.59 and skin at ~0.42, which is what separates them; a single colour at tol 46 catches skin and reports phantom bands up at the shoulders.",
|
|
"band_top_m": 1.062,
|
|
"band_bottom_m": 0.669,
|
|
"band_span_m": 0.393,
|
|
"band_px": 12435,
|
|
"verdict": "PASS. top -13 mm vs target 1.075 (tol +/-30), hem -16 mm vs 0.685 (tol +/-40). Measured span 0.393 m against a 0.390 m drafted panel, so the cloth is hanging at full length, not gathered."
|
|
},
|
|
"not_yet_built": [
|
|
"Frayed/ragged hem: the reference hem is torn, ~3.5 cm of teeth below the solid hem at 0.685. Must be GEOMETRY (outline teeth, piupiu technique) because the clothing pipeline carries no alpha channel.",
|
|
"Diagonal wrap overlap across the front-left of the reference.",
|
|
"Back waist tie: knot plus two short hanging ends."
|
|
]
|
|
},
|
|
"md": {
|
|
"reset": "new_project",
|
|
"avatar_fbx": "C:/Users/Jeremy/tinqs/animation/tools/tailor/avatar/Lena_QuatSkin_Avatar.fbx",
|
|
"avatar_scale": 10.0,
|
|
"add_arrangement_points": true,
|
|
"auto_translate": true,
|
|
"zfab": "C:/Users/Public/Documents/MarvelousDesigner/New Assets/Fabric/(Default for Simulation).zfab",
|
|
"texture": "tools/tailor/textures/hunter_cloth.png",
|
|
"texture_dpi": 130.0,
|
|
"panels": [
|
|
{
|
|
"name": "front",
|
|
"dx": 0.0,
|
|
"note": "Width profile drafted against the MEASURED BODY HULL (both legs), not the measurement card: the card's body_circ_at CLAMPS to hip_circ below the hip, hiding that Lena's two thighs together are 120.5 cm at z=0.82 vs 105.6 cm at the hip. Levels (y, half-mm): 390/360, 325/465, 260.5/560, 215/615, 135/645, 0/665. >=3.2 cm ease everywhere. Lines: 0 waist | 1-5 side_R (top->bottom) | 6 hem | 7-11 side_L (bottom->top).",
|
|
"points": [
|
|
[
|
|
152.5,
|
|
390.0
|
|
],
|
|
[
|
|
512.5,
|
|
390.0
|
|
],
|
|
[
|
|
565.0,
|
|
325.0
|
|
],
|
|
[
|
|
612.5,
|
|
260.5
|
|
],
|
|
[
|
|
640.0,
|
|
215.0
|
|
],
|
|
[
|
|
655.0,
|
|
135.0
|
|
],
|
|
[
|
|
665.0,
|
|
0.0
|
|
],
|
|
[
|
|
0.0,
|
|
0.0
|
|
],
|
|
[
|
|
10.0,
|
|
135.0
|
|
],
|
|
[
|
|
25.0,
|
|
215.0
|
|
],
|
|
[
|
|
52.5,
|
|
260.5
|
|
],
|
|
[
|
|
100.0,
|
|
325.0
|
|
]
|
|
]
|
|
},
|
|
{
|
|
"name": "back",
|
|
"dx": 915.0,
|
|
"note": "identical panel offset by dx (NOT mirrored) -> sides CROSS-pair, ONE reversed",
|
|
"points": [
|
|
[
|
|
152.5,
|
|
390.0
|
|
],
|
|
[
|
|
512.5,
|
|
390.0
|
|
],
|
|
[
|
|
565.0,
|
|
325.0
|
|
],
|
|
[
|
|
612.5,
|
|
260.5
|
|
],
|
|
[
|
|
640.0,
|
|
215.0
|
|
],
|
|
[
|
|
655.0,
|
|
135.0
|
|
],
|
|
[
|
|
665.0,
|
|
0.0
|
|
],
|
|
[
|
|
0.0,
|
|
0.0
|
|
],
|
|
[
|
|
10.0,
|
|
135.0
|
|
],
|
|
[
|
|
25.0,
|
|
215.0
|
|
],
|
|
[
|
|
52.5,
|
|
260.5
|
|
],
|
|
[
|
|
100.0,
|
|
325.0
|
|
]
|
|
]
|
|
}
|
|
],
|
|
"seams": [
|
|
{
|
|
"a": "front",
|
|
"a_line": 1,
|
|
"b": "back",
|
|
"b_line": 11,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
},
|
|
{
|
|
"a": "front",
|
|
"a_line": 2,
|
|
"b": "back",
|
|
"b_line": 10,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
},
|
|
{
|
|
"a": "front",
|
|
"a_line": 3,
|
|
"b": "back",
|
|
"b_line": 9,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
},
|
|
{
|
|
"a": "front",
|
|
"a_line": 4,
|
|
"b": "back",
|
|
"b_line": 8,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
},
|
|
{
|
|
"a": "front",
|
|
"a_line": 5,
|
|
"b": "back",
|
|
"b_line": 7,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
},
|
|
{
|
|
"a": "front",
|
|
"a_line": 11,
|
|
"b": "back",
|
|
"b_line": 1,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
},
|
|
{
|
|
"a": "front",
|
|
"a_line": 10,
|
|
"b": "back",
|
|
"b_line": 2,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
},
|
|
{
|
|
"a": "front",
|
|
"a_line": 9,
|
|
"b": "back",
|
|
"b_line": 3,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
},
|
|
{
|
|
"a": "front",
|
|
"a_line": 8,
|
|
"b": "back",
|
|
"b_line": 4,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
},
|
|
{
|
|
"a": "front",
|
|
"a_line": 7,
|
|
"b": "back",
|
|
"b_line": 5,
|
|
"reverse_a": false,
|
|
"reverse_b": true
|
|
}
|
|
],
|
|
"arrangements": [
|
|
{
|
|
"panel": "front",
|
|
"point": "Leg_Skirt_Front",
|
|
"offset": [
|
|
50,
|
|
92,
|
|
50
|
|
]
|
|
},
|
|
{
|
|
"panel": "back",
|
|
"point": "Leg_Skirt_Back",
|
|
"offset": [
|
|
0,
|
|
92,
|
|
50
|
|
]
|
|
}
|
|
],
|
|
"sim": {
|
|
"strengthen": false,
|
|
"settle_frames": 200,
|
|
"relax_frames": 60
|
|
},
|
|
"cam_viewpoint": 2,
|
|
"presim_snapshot": "C:/Users/Jeremy/AppData/Local/Temp/tinqs_md_hunter_skirt_v8_presim.png",
|
|
"snapshot": "C:/Users/Jeremy/AppData/Local/Temp/tinqs_md_hunter_skirt_v8.png",
|
|
"back_snapshot": "C:/Users/Jeremy/AppData/Local/Temp/tinqs_md_hunter_skirt_v8_back.png",
|
|
"export_dir": "C:/Users/Jeremy/tinqs/animation/tools/tailor",
|
|
"export_basename": "lena_hunter_skirt_v8",
|
|
"exports": [
|
|
"zprj",
|
|
"fbx",
|
|
"obj",
|
|
"zpac"
|
|
]
|
|
},
|
|
"expect": {
|
|
"bands": {
|
|
"hunter_skirt_v8": {
|
|
"top_m": 1.075,
|
|
"bottom_m": 0.685,
|
|
"tol_m": 0.03,
|
|
"bottom_tol_m": 0.04,
|
|
"from": "cover"
|
|
}
|
|
}
|
|
},
|
|
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_hunter_skirt_v8_garment.fbx",
|
|
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin.glb",
|
|
"weld_threshold": 0.0006,
|
|
"shell_mm": 4,
|
|
"min_island_verts": 40,
|
|
"align": {
|
|
"top_bone": "spine_01",
|
|
"scale_xy": 0.1,
|
|
"scale_z": 0.1,
|
|
"z_nudge": 0.0,
|
|
"xy_nudge": [
|
|
0.0,
|
|
0.0
|
|
]
|
|
},
|
|
"parts": {
|
|
"HunterSkirt": {
|
|
"slot": "Legs",
|
|
"islands": [
|
|
0
|
|
],
|
|
"tris": 4000,
|
|
"planar_deg": 5,
|
|
"fit": {
|
|
"target": "BODY_SHELL",
|
|
"mask": "full",
|
|
"offset_mm": 3,
|
|
"wrap_mode": "OUTSIDE",
|
|
"hem_mm": 14
|
|
},
|
|
"weights": "dress",
|
|
"color": [
|
|
0.42,
|
|
0.31,
|
|
0.23
|
|
],
|
|
"texture": "../tools/tailor/textures/hunter_cloth.png"
|
|
}
|
|
},
|
|
"export": {
|
|
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/hunter",
|
|
"gender": "Female",
|
|
"set": "Hunter",
|
|
"note": "Hunter wrap skirt (brown coarse cloth) - Legs slot"
|
|
}
|
|
} |