Skip to content

fix(examples): redesign vertex-weight-limit as a painted industrial arm - #264

Merged
TMHSDigital merged 1 commit into
mainfrom
fix/hero-vertex-weight-limit
Sep 26, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
fix/hero-vertex-weight-limit

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

What changed and why

The gallery review singled out vertex-weight-limit: a stack of orange cylinders with dark rings in a mostly empty frame (low horizontal fill), no design, and the bone influences it is about were invisible.

  • Redesigned model. One skinned mesh (MechArm) shaped as a six-axis-style industrial robot arm:
    • Root: a bolted floor plinth, turret drum and finned rear drive pack.
    • Shoulder and elbow: clevis cheeks and servo drums with bolt circles.
    • Arms: tapered box-section upper arm and forearm with framed side hatches.
    • A gas-spring balancer across the shoulder. Its rod is drawn in the posed frame and pulled back through the bone's deform matrix, so it stays coaxial with the barrel.
    • A wrist fork and a two-jaw gripper with rubber pads.
    • Five materials: HazardOrange, Gunmetal, MachinedSteel, GripRubber, WeightMap. Smooth shading with sharp-by-angle, and no modifier.
    • The arm is posed in a reach (Shoulder -45, Elbow -60, Wrist -55) and the rig is turned so the reach runs left to right.
  • The weights are now visible. The render path paints the post-limit weights, read back from v.groups, as a BoneBlend colour attribute: Σ wᵢ·colourᵢ, displayed matte through an Attribute node.
    • Each rigid segment shows its bone's flat colour: blue turret, teal upper arm, violet forearm, magenta wrist, lime gripper.
    • The two back cables grade from colour to colour exactly where the skin weights blend across each joint.
  • Stays truthful to numeric-only. The four-influence cap itself still has no visual signature. The pruned fifth weight is the auto-weight spill, at most 0.0027 on any vertex, so a five-influence arm paints and deforms the same. The README now has a "What the render shows" section that says exactly this. The VISUAL-STYLE numeric-only precedent still holds.
  • Weight authoring. Flex (cable) vertices get a smoothstep hand-over between neighbouring bones plus an auto-weight-style distance-ranked spill onto all five bones. Rigid parts are weighted 1.0 to one bone. No check was changed or loosened.
  • The render path now also calls gallery_asset_quality.check_asset_quality (exit 11, added to the README table).
  • scripts/asset_sheet_panel.py now keeps armature objects. They never render, and deleting one drops a skinned asset back to its rest pose: this arm would stand straight up with the balancer rod detached. This is a one-line change, and the reference panels are unaffected because they have no armatures.

Before / after

Gate numbers (5.2.1)

  • Framing: fill x=0.725, y=0.872 (band 0.70–0.90). Margins: left 0.128, right 0.147, bottom 0.067, top 0.061. No touch. framing_ok.
  • Asset quality: no default names, materials=5, edge90=0.027 (516/18910 edges), degenerate_faces=0, compactness 60.4 (info). aq_ok.
  • Contact sheet (luma / stage / warmth / sat):
tile luma stage warmth sat
candidate 0.2555 0.2248 +0.2035 0.1763
armature-bend 0.2787 0.2132 -0.4279 0.1436
damped-track-aim 0.1511 0.1448 +0.2772 0.2305
bmesh-gear 0.3024 0.2357 +0.3743 0.1953
  • Contact-sheet verdicts:
    • Stage darkness: pass (0.225, within the calibration spread).
    • Wedge warmth: pass (+0.20, warm).
    • Subject fill: pass (the arm spans the frame, where the old hero left the side thirds empty).
    • Saturation: pass (0.176, within the band).
    • Thumbnail legibility: pass. At 427x240 it reads as a robot arm with a colour-graded cable.
    • Mean luminance 0.2555 sits inside the calibration range 0.151–0.302.
  • Asset-sheet verdict against collision-hull-proxy, socket-attach-points, vertex-color-ao, wheelbarrow and apothecary-shelf: pass. The arm is not the least-designed object in the lineup. It has named mechanical subassemblies, five materials and edge90 0.027.
    • The harness's generic 3/4 fit clips the near corner of the drive pack and plinth in the arm's panel. The perspective enlarges the part nearest the camera. This is a harness trait, not a model defect.
  • measure_hero_drift.py --only vertex-weight-limit: mean_abs 0.00412, luma 0.2555/0.2550, verdict matches.

Checks per binary (check-only path via tests/smoke/run_example.py)

binary reported version result
E:\Blender-Developer-Tools\.scratch\blender-5.2.1-windows-x64\blender.exe Blender 5.2.1 LTS PASS
E:\Blender-Developer-Tools\.scratch\blender-5.1.2-windows-x64\blender.exe Blender 5.1.2 PASS
E:\Blender-Developer-Tools\.scratch\blender-4.5.11-windows-x64\blender.exe Blender 4.5.11 LTS PASS

All three report identical numbers:

  • verts=10248, pre_max=5, post_max=4, limited_verts=3108
  • sum_err=4.26e-08, pose_dev=4.18e-03 (tol 0.05), lbs_err=1.22e-06 (tol 5e-4), root_move=1.23e-07

The --output render path was also run on 4.5.11: framing_ok and aq_ok, mean pixel difference 0.18/255 against 5.2.1.

Falsifiers (5.2.1; --skip-limit on all three binaries)

The checks themselves are unchanged. They were re-proven because the geometry and weight authoring changed.

probe exit measured
--skip-limit (4.5.11, 5.1.2, 5.2.1) 4 "vertex carries 5 groups after the limit"
drop without renormalize 6 sums off by 2.647e-03
SPILL = 0 (no five-influence tail) 3 pre-limit max influences 2 != 5
prune to one influence 7 pose moved 0.1915 (tol 0.05)
pose the Root bone -3° 9 Root mount moved 0.063394
predict LBS with w**1.1 8 deviates 0.227864

Proven by live run vs established by inspection only

Proven by live run:

  • All of the check, falsifier, framing, asset-quality, contact-sheet, asset-sheet and drift numbers above.
  • build_gallery.py regeneration. The generated <img alt> in docs/gallery/index.html and docs/gallery/vertex-weight-limit/index.html was read and matches the new 184-character alt.

Established by inspection only:

  • That the colour map visibly tracks the blend zones. This is judged by eye on the render, and follows from paint_weight_map reading v.groups.
  • That the reference panels are unaffected by the armature-keep tweak (they contain no armature objects).

docs/VISUAL-STYLE.md was not edited. Its asset-quality table records historical measurements for the former reference row. The new floors for this asset are listed above for the table's owner.

🤖 Generated with Claude Code

The gallery review singled this hero out: a stack of orange cylinders in a
mostly empty frame, and the bone influences the example is about were
invisible. The arm is now a designed six-axis-style industrial robot -
bolted plinth, turret, finned drive pack, clevis cheeks and servo drums,
box-section arms, a gas-spring balancer, wrist fork and two-jaw gripper -
in a reaching pose that fills the frame (fill 0.725x / 0.872y).

The render path now paints the post-limit weights, read back from v.groups,
as a BoneBlend colour attribute: rigid segments show their bone's colour and
the two back cables grade across each joint, so the viewer sees where bones
blend. The four-influence cap itself stays numeric-only (the pruned spill is
at most 0.0027), and the README says so.

Weights are now authored as a joint hand-over plus an auto-weight-style
spill on the cables; all checks are unchanged and pass identically on
4.5.11, 5.1.2 and 5.2.1, each re-falsified. The render path also gains the
asset-quality gate (exit 11). asset_sheet_panel.py keeps armatures so a
skinned asset is sheeted in its pose rather than its rest pose.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
@github-actions github-actions Bot added examples Runnable smoke-gated examples under examples/ documentation Improvements or additions to documentation labels Sep 26, 2026
@TMHSDigital
TMHSDigital merged commit 3433333 into main Sep 26, 2026
11 checks passed
@TMHSDigital
TMHSDigital deleted the fix/hero-vertex-weight-limit branch September 26, 2026 23:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation examples Runnable smoke-gated examples under examples/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant