fix(assets): T-1090 — five fork bodies rebuilt; mesh+armature scale baked together
Root cause was double: (1) segment_body's apply_scale scaled fork MESH vertices but not each segment's embedded armature — the shared-skeleton compositor relocates segments by bone name, so internally-inconsistent segments exploded (child worst at 0.72x: head bone 0.35m above its mesh — detached heads, spider arms); (2) thin/heavy were stale high-poly artifacts from an older segmentation, missing seg_hips. Fix: apply_fork_scale bakes mesh AND embedded armature via transform_apply (edit-bone poking shears chains — first attempt proved it); new blender_rebuild_forks.py rebuilds exactly the five from the owned UBC Source exports. All five now 19 low-poly segments matching the healthy six. QA on the real compositor (idle+walk, front+side): 5/5 coherent; healthy controls unchanged. Q-060 answered at the extremes: 15/15 peasant-garment Surface Deform binds on the forks, zero shrinkwrap fallbacks, no bust-through — the 6-of-11 placeholder debt is paid (fork garment variants included). Follow-up filed: T-1094 (child/teen composite at adult height — pre-existing shared-skeleton normalization, not a regression). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@@ -7,3 +7,4 @@ INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_
|
||||
INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKE0J4B8GQ17NFFV8N7D45BW', 'T-1091', '2026-07-06 10:38:43.290', '2026-07-06 10:38:43.290', NULL, 'da0796307c06acd6609ac466d6ea48c3', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash);
|
||||
INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKH8SJRMXTP6XQNBXHRD4CQ0', 'T-1092', '2026-07-06 18:14:07.303', '2026-07-06 18:14:07.303', NULL, 'e34fe437eac3bdbd6a73f8d98bc871a9', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash);
|
||||
INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKHFRCP5R0VBA9BKR97RRBJ0', 'T-1093', '2026-07-06 18:44:32.562', '2026-07-06 18:44:32.562', NULL, 'ce581695739eea8cd11433cb9f6c86d1', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash);
|
||||
INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKJ25KG3ADM4M5XRXCVR2GQG', 'T-1094', '2026-07-06 20:04:59.393', '2026-07-06 20:04:59.393', NULL, 'e856fa3f89f621007a058db26aff2a05', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash);
|
||||
|
||||
@@ -712,3 +712,10 @@ INSERT INTO tickets (record_id, type, parent_record_id, title, description, stat
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKHFRCP5R0VBA9BKR97RRBJ0', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Server aim-lock: explicit SetFacing should survive accepted moves (vision-cone flap during path-follows)', 'Found live in the T-1088 sandbox: during a client path-follow the vision cone flaps to path-forward on every accepted step because movement.rs facing_from_delta overwrites Facing on each move, and D-054''s change-gated SetFacing never re-asserts an unchanged octant. Client mitigation shipped (InputMapper.reassert_facing ~2 ticks after each emitted step) shrinks the flap to ~100ms per step but cannot eliminate it — movement wins within a tick. Proper fix is server-side facing decoupling (e.g. an explicit-aim flag/timestamp on Facing that accepted moves do not overwrite while fresh), which is exactly Q-084''s parked walk-vs-aim split now with play evidence. Needs a D-record before wire semantics change; touch nothing until the sidequest''s presentation-layer constraint lifts.', 'in_progress', 'medium', NULL, 'server', NULL, '2026-07-06 18:44:32.561', '2026-07-06 18:55:29.037', NULL, '01cc8d20f141986d0d4fdfe4d6cb1f22', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKHFRCP5R0VBA9BKR97RRBJ0', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Server aim-lock: explicit SetFacing should survive accepted moves (vision-cone flap during path-follows)', 'Found live in the T-1088 sandbox: during a client path-follow the vision cone flaps to path-forward on every accepted step because movement.rs facing_from_delta overwrites Facing on each move, and D-054''s change-gated SetFacing never re-asserts an unchanged octant. Client mitigation shipped (InputMapper.reassert_facing ~2 ticks after each emitted step) shrinks the flap to ~100ms per step but cannot eliminate it — movement wins within a tick. Proper fix is server-side facing decoupling (e.g. an explicit-aim flag/timestamp on Facing that accepted moves do not overwrite while fresh), which is exactly Q-084''s parked walk-vs-aim split now with play evidence. Needs a D-record before wire semantics change; touch nothing until the sidequest''s presentation-layer constraint lifts.', 'done', 'medium', NULL, 'server', NULL, '2026-07-06 18:44:32.561', '2026-07-06 19:18:30.657', NULL, 'a71401dfc41971383da8d314361e15bb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKE0EW2617K9VE4QHSYSR9HW', 'bug', '06FB0TNSRXX29H5X0EB0F0GBW4', '5 of 11 body types misrender bare in CharacterVisual (thin_f/m, heavy_f/m, child)', 'Found by the T-1089 Synty intake spike (2026-07-06), body-only controls with NO garment attached: thin_f/m, heavy_f/m, child misrender in CharacterVisual (exploded/spider arms, detached head/hair; child 303mm max warp, 87 collapsed edges; f-bodies bust-through). These are the newer high-poly bodies (no seg_hips, different segmentation) — exactly the 5 with no production peasant-clothing variants. Upstream of ANY clothing route; blocks T-1089''s 11-of-11 acceptance criterion and resolves part of Q-060. Evidence: spikes/synty-intake/out/bodies_fit_log.json + out/qa_bodies/ (44 screenshots) + out/bodies_recon.json.', 'in_progress', 'high', NULL, 'client', NULL, '2026-07-06 10:38:16.593', '2026-07-06 19:25:35.248', NULL, 'ec4a20d81cb872c936cd825d4ebca616', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKE0EW2617K9VE4QHSYSR9HW', 'bug', '06FB0TNSRXX29H5X0EB0F0GBW4', '5 of 11 body types misrender bare in CharacterVisual (thin_f/m, heavy_f/m, child)', 'Found by the T-1089 Synty intake spike (2026-07-06), body-only controls with NO garment attached: thin_f/m, heavy_f/m, child misrender in CharacterVisual (exploded/spider arms, detached head/hair; child 303mm max warp, 87 collapsed edges; f-bodies bust-through). These are the newer high-poly bodies (no seg_hips, different segmentation) — exactly the 5 with no production peasant-clothing variants. Upstream of ANY clothing route; blocks T-1089''s 11-of-11 acceptance criterion and resolves part of Q-060. Evidence: spikes/synty-intake/out/bodies_fit_log.json + out/qa_bodies/ (44 screenshots) + out/bodies_recon.json.
|
||||
|
||||
RESOLVED (pending review). Root cause: fork bodies (thin/heavy/child) had a mesh<->armature mismatch. blender_segment_body.py apply_scale scaled mesh vertices ONLY, leaving the embedded armature at source scale; since character_visual.gd binds every segment onto ONE shared skeleton (skeleton/armature.glb) by bone name, each segment must be internally consistent with its own embedded armature — the mesh-only scale dropped the head ~0.35m below the Head bone and flung limbs apart on relocation. thin/heavy were additionally stale high-poly artifacts (torso 1419-1704v vs 375v) missing seg_hips entirely. Fix: replaced apply_scale with apply_fork_scale (tooling/blender_segment_body.py) which scales mesh AND armature together and BAKES via Blender transform_apply (edit-bone poking alone shears connected chains — arms/fingers still exploded). Rebuilt all 5 via new tooling/blender_rebuild_forks.py from Source-tier gltf; now 19 segments incl seg_hips, low-poly matching the healthy six. Bare-body QA (idle+walk, front+side, real CharacterVisual): all 5 coherent, head/hair attached, no explosion; healthy 6 untouched. Q-060: all 3 peasant garments Surface-Deform-fit onto all 5 forks (15/15 surface_deform, 0 shrinkwrap fallback) — Surface Deform HOLDS at the extremes on repaired bodies. No manifest change (body ids/paths unchanged).', 'in_progress', 'high', NULL, 'client', NULL, '2026-07-06 10:38:16.593', '2026-07-06 20:02:30.990', NULL, 'faba67bd9fa9be117a752e07459c5814', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKE0EW2617K9VE4QHSYSR9HW', 'bug', '06FB0TNSRXX29H5X0EB0F0GBW4', '5 of 11 body types misrender bare in CharacterVisual (thin_f/m, heavy_f/m, child)', 'Found by the T-1089 Synty intake spike (2026-07-06), body-only controls with NO garment attached: thin_f/m, heavy_f/m, child misrender in CharacterVisual (exploded/spider arms, detached head/hair; child 303mm max warp, 87 collapsed edges; f-bodies bust-through). These are the newer high-poly bodies (no seg_hips, different segmentation) — exactly the 5 with no production peasant-clothing variants. Upstream of ANY clothing route; blocks T-1089''s 11-of-11 acceptance criterion and resolves part of Q-060. Evidence: spikes/synty-intake/out/bodies_fit_log.json + out/qa_bodies/ (44 screenshots) + out/bodies_recon.json.
|
||||
|
||||
RESOLVED (pending review). Root cause: fork bodies (thin/heavy/child) had a mesh<->armature mismatch. blender_segment_body.py apply_scale scaled mesh vertices ONLY, leaving the embedded armature at source scale; since character_visual.gd binds every segment onto ONE shared skeleton (skeleton/armature.glb) by bone name, each segment must be internally consistent with its own embedded armature — the mesh-only scale dropped the head ~0.35m below the Head bone and flung limbs apart on relocation. thin/heavy were additionally stale high-poly artifacts (torso 1419-1704v vs 375v) missing seg_hips entirely. Fix: replaced apply_scale with apply_fork_scale (tooling/blender_segment_body.py) which scales mesh AND armature together and BAKES via Blender transform_apply (edit-bone poking alone shears connected chains — arms/fingers still exploded). Rebuilt all 5 via new tooling/blender_rebuild_forks.py from Source-tier gltf; now 19 segments incl seg_hips, low-poly matching the healthy six. Bare-body QA (idle+walk, front+side, real CharacterVisual): all 5 coherent, head/hair attached, no explosion; healthy 6 untouched. Q-060: all 3 peasant garments Surface-Deform-fit onto all 5 forks (15/15 surface_deform, 0 shrinkwrap fallback) — Surface Deform HOLDS at the extremes on repaired bodies. No manifest change (body ids/paths unchanged).', 'review', 'high', NULL, 'client', NULL, '2026-07-06 10:38:16.593', '2026-07-06 20:02:31.012', NULL, '5cec3f5395cb96910151ae43d10076dc', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKJ25KG3ADM4M5XRXCVR2GQG', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Child/teen bodies composite at adult height — shared-skeleton normalization discards stature', 'Found during T-1090 repair (2026-07-06): the shared-skeleton compositor (character_visual.gd binds every segment to the one Regular-sized armature by bone name) normalizes global scale — only cross-sectional shape survives, so thin reads narrow and heavy reads wide (correct) but child and teen stand at ADULT height. Pre-existing behavior, not a T-1090 regression. If stature matters (it will — children in crowds), options: per-body runtime skeleton, node-level scale on CharacterVisual, or bone-length retarget at load. Interacts with animation retargeting (shorter limbs vs shared UAL clips) and D-164. Sprint-28 verdict warns runtime BONE scaling fails — evaluate NODE scale first.', 'backlog', 'medium', NULL, 'client', NULL, '2026-07-06 20:04:59.392', '2026-07-06 20:04:59.392', NULL, '7ceb0fb9f90b36988d9d2b75765c9585', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
|
||||
@@ -1,20 +1,19 @@
|
||||
# Fork body type — auto-generated from mesh scaling
|
||||
# Fork body type — auto-generated from mesh + armature scaling (T-1090)
|
||||
|
||||
This directory contains **child** body segments, generated by applying
|
||||
a proportional mesh scale to the source body (Teen_Male_FullBody.gltf):
|
||||
This directory contains **child** body segments, generated by applying a
|
||||
proportional scale to the source body (Teen_Male_FullBody.gltf) mesh AND its armature rest pose
|
||||
together, then segmenting:
|
||||
|
||||
Scale: (0.75, 0.72, 0.75)
|
||||
|
||||
The Y scale (0.72) differs from XZ (0.75) intentionally: children have different
|
||||
proportions from adults. They are not simply uniformly smaller — their limbs are
|
||||
shorter relative to torso height (Y) compared to torso width/depth (XZ). The
|
||||
non-uniform scale captures this: the child is 75% of teen width/depth but only
|
||||
72% of teen height, reflecting the head-to-body ratio and limb length differences
|
||||
typical of pre-teen proportions.
|
||||
The scale is applied to the mesh vertices and the embedded armature rest pose
|
||||
with the SAME affine (T-1090 fix). This keeps each segment internally consistent
|
||||
with its own skeleton, which the shared-skeleton compositor
|
||||
(character_visual.gd) requires — a mesh-only scale detaches the head and
|
||||
explodes the limbs on relocation.
|
||||
|
||||
These segments are APPROXIMATE. They produce a visually distinct silhouette
|
||||
but are not artist-authored from scratch. Review the proportions and refine
|
||||
the base mesh manually if the auto-scale result is not satisfactory.
|
||||
Cross-sectional differentiation (thin = narrow, heavy = wide) survives the
|
||||
composite; global height normalises to the shared skeleton (see T-1090 report /
|
||||
Q-060 for the shared-skeleton scale-normalisation note).
|
||||
|
||||
Status: auto-generated, needs artist review
|
||||
Sprint 28 — visual team
|
||||
Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
# Fork body type — auto-generated from mesh scaling
|
||||
# Fork body type — auto-generated from mesh + armature scaling (T-1090)
|
||||
|
||||
This directory contains **heavy_f** body segments, generated by applying
|
||||
a proportional mesh scale to the source body (Regular_Female_FullBody.gltf):
|
||||
This directory contains **heavy_f** body segments, generated by applying a
|
||||
proportional scale to the source body (Regular_Female_FullBody.gltf) mesh AND its armature rest pose
|
||||
together, then segmenting:
|
||||
|
||||
Scale: (1.20, 1.08, 1.00)
|
||||
|
||||
These segments are APPROXIMATE. They produce a visually distinct silhouette
|
||||
but are not artist-authored from scratch. Review the proportions and refine
|
||||
the base mesh manually if the auto-scale result is not satisfactory.
|
||||
The scale is applied to the mesh vertices and the embedded armature rest pose
|
||||
with the SAME affine (T-1090 fix). This keeps each segment internally consistent
|
||||
with its own skeleton, which the shared-skeleton compositor
|
||||
(character_visual.gd) requires — a mesh-only scale detaches the head and
|
||||
explodes the limbs on relocation.
|
||||
|
||||
Status: auto-generated, needs artist review
|
||||
Sprint 28 — visual team
|
||||
Cross-sectional differentiation (thin = narrow, heavy = wide) survives the
|
||||
composite; global height normalises to the shared skeleton (see T-1090 report /
|
||||
Q-060 for the shared-skeleton scale-normalisation note).
|
||||
|
||||
Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips
|
||||
|
||||
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 3.7 MiB |
|
After Width: | Height: | Size: 3.1 MiB |
@@ -1,13 +1,19 @@
|
||||
# Fork body type — auto-generated from mesh scaling
|
||||
# Fork body type — auto-generated from mesh + armature scaling (T-1090)
|
||||
|
||||
This directory contains **heavy_m** body segments, generated by applying
|
||||
a proportional mesh scale to the source body (Regular_Male_FullBody.gltf):
|
||||
This directory contains **heavy_m** body segments, generated by applying a
|
||||
proportional scale to the source body (Regular_Male_FullBody.gltf) mesh AND its armature rest pose
|
||||
together, then segmenting:
|
||||
|
||||
Scale: (1.20, 1.08, 1.00)
|
||||
|
||||
These segments are APPROXIMATE. They produce a visually distinct silhouette
|
||||
but are not artist-authored from scratch. Review the proportions and refine
|
||||
the base mesh manually if the auto-scale result is not satisfactory.
|
||||
The scale is applied to the mesh vertices and the embedded armature rest pose
|
||||
with the SAME affine (T-1090 fix). This keeps each segment internally consistent
|
||||
with its own skeleton, which the shared-skeleton compositor
|
||||
(character_visual.gd) requires — a mesh-only scale detaches the head and
|
||||
explodes the limbs on relocation.
|
||||
|
||||
Status: auto-generated, needs artist review
|
||||
Sprint 28 — visual team
|
||||
Cross-sectional differentiation (thin = narrow, heavy = wide) survives the
|
||||
composite; global height normalises to the shared skeleton (see T-1090 report /
|
||||
Q-060 for the shared-skeleton scale-normalisation note).
|
||||
|
||||
Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips
|
||||
|
||||
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 3.0 MiB |
@@ -1,13 +1,19 @@
|
||||
# Fork body type — auto-generated from mesh scaling
|
||||
# Fork body type — auto-generated from mesh + armature scaling (T-1090)
|
||||
|
||||
This directory contains **thin_f** body segments, generated by applying
|
||||
a proportional mesh scale to the source body (Regular_Female_FullBody.gltf):
|
||||
This directory contains **thin_f** body segments, generated by applying a
|
||||
proportional scale to the source body (Regular_Female_FullBody.gltf) mesh AND its armature rest pose
|
||||
together, then segmenting:
|
||||
|
||||
Scale: (0.82, 1.00, 0.88)
|
||||
|
||||
These segments are APPROXIMATE. They produce a visually distinct silhouette
|
||||
but are not artist-authored from scratch. Review the proportions and refine
|
||||
the base mesh manually if the auto-scale result is not satisfactory.
|
||||
The scale is applied to the mesh vertices and the embedded armature rest pose
|
||||
with the SAME affine (T-1090 fix). This keeps each segment internally consistent
|
||||
with its own skeleton, which the shared-skeleton compositor
|
||||
(character_visual.gd) requires — a mesh-only scale detaches the head and
|
||||
explodes the limbs on relocation.
|
||||
|
||||
Status: auto-generated, needs artist review
|
||||
Sprint 28 — visual team
|
||||
Cross-sectional differentiation (thin = narrow, heavy = wide) survives the
|
||||
composite; global height normalises to the shared skeleton (see T-1090 report /
|
||||
Q-060 for the shared-skeleton scale-normalisation note).
|
||||
|
||||
Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips
|
||||
|
||||
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 3.7 MiB |
|
After Width: | Height: | Size: 3.1 MiB |
@@ -1,13 +1,19 @@
|
||||
# Fork body type — auto-generated from mesh scaling
|
||||
# Fork body type — auto-generated from mesh + armature scaling (T-1090)
|
||||
|
||||
This directory contains **thin_m** body segments, generated by applying
|
||||
a proportional mesh scale to the source body (Regular_Male_FullBody.gltf):
|
||||
This directory contains **thin_m** body segments, generated by applying a
|
||||
proportional scale to the source body (Regular_Male_FullBody.gltf) mesh AND its armature rest pose
|
||||
together, then segmenting:
|
||||
|
||||
Scale: (0.82, 1.00, 0.88)
|
||||
|
||||
These segments are APPROXIMATE. They produce a visually distinct silhouette
|
||||
but are not artist-authored from scratch. Review the proportions and refine
|
||||
the base mesh manually if the auto-scale result is not satisfactory.
|
||||
The scale is applied to the mesh vertices and the embedded armature rest pose
|
||||
with the SAME affine (T-1090 fix). This keeps each segment internally consistent
|
||||
with its own skeleton, which the shared-skeleton compositor
|
||||
(character_visual.gd) requires — a mesh-only scale detaches the head and
|
||||
explodes the limbs on relocation.
|
||||
|
||||
Status: auto-generated, needs artist review
|
||||
Sprint 28 — visual team
|
||||
Cross-sectional differentiation (thin = narrow, heavy = wide) survives the
|
||||
composite; global height normalises to the shared skeleton (see T-1090 report /
|
||||
Q-060 for the shared-skeleton scale-normalisation note).
|
||||
|
||||
Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips
|
||||
|
||||