fix(examples): redesign gltf-skin-roundtrip as a mech scorpion standoff - #265
Merged
Merged
Conversation
The review singled this hero out: two near-identical scorpions built from untextured orange boxes, with legs clipping into each other and the floor. The image gave the eye nothing to compare, because a pass meant "they look the same". The model is rebuilt from scratch. It has a lofted gunmetal chassis under a crowned carapace and five shingled tergite plates. Eight jointed legs have painted femur armour, hydraulic rams and knee drums, and they plant on rubber pads. Each claw has three bones (arm, swollen chela, movable finger). The tail has five armoured collars on rubber bellows, and a telson with a venom band and a chrome needle. There are 5 materials, and emission is used only on the eyes and the venom band. The rig grows from 7 bones to 21, with bones pointing +Y, -Y and +/-X, so the rest-matrix round-trip is exercised off the old single axis. The composition now witnesses the skin. The authored rig holds the guard pose the check compares. The actual re-imported mesh is driven through its IMPORTED armature into a different strike pose. A file that lost the skin, the joints or the weights could not follow that pose. The render path now runs gallery_framing (exit 10) and gallery_asset_quality (exit 11). Two check-protocol bugs were found and fixed; both make the check stricter: - The "straddle-safe" neighbour lookup added +/-1e-4 without re-rounding, so only the exact key could ever match. It reported a phantom weight loss (exit 18, 1.0) once the redesign put a vertex on a rounding boundary. - got_w kept only the last re-imported vertex per position. A corrupted split copy hid behind its twin, and the weight falsifier fell through to exit 19 instead of 18. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…tion sets After the rebase onto main, two things changed. #258 re-rendered bmesh-gear, which darkened the contact-sheet calibration, and #257 raised the asset-sheet reference set. The scorpion stage measured 0.236, brighter than every calibration tile, so the key, fill, rim and wedge come down until the stage sits inside the set (0.204). Luma is now 0.231. The committed asset-sheet tool gains a row for this example, and it now bakes an Armature-deformed asset's staged pose before it removes the rig. Without that bake a skinned asset falls back to its rest pose, and the scorpion rendered with its tail stretched flat. None of the five references is skinned, so their panels are unchanged. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The gallery review singled out this hero. It showed two near-identical scorpions built from untextured orange boxes, with legs clipping into each other and the floor, and no readable design. It also fell into the identical-copies trap: a pass meant "they look the same", so the eye had nothing to compare.
What changed
The model was rebuilt from scratch as a designed mech scorpion:
It uses 5 materials (hazard paint, gunmetal, chrome, rubber, venom glow). Emission is used only on the eyes and the venom band.
The rig grows from 7 bones to 21. Bones now point +Y, -Y and ±X, so the rest-matrix round-trip is exercised off the old single axis. Weights are rigid on the plates. There are two-bone smoothstep blends in the rubber boots at every flexing joint: 840 disk vertices carry two influences.
The composition witnesses the skin. On the left, the authored rig holds the guard pose the check compares: tail coiled, claws tucked. On the right is the actual re-imported mesh, driven through its imported armature into a different strike pose: tail reared, claws raised, pincers gaping. A file that lost the skin, the joints or the weights could not follow that pose. Posing uses rest-space axes in quaternions, so the same call drives both rigs; the glTF importer leaves its bones in quaternion mode. No text labels.
The render path is now gated. It calls
gallery_framing(exit 10) andgallery_asset_quality(exit 11); the old render path called neither.Two check-protocol bugs were fixed. Both make the check stricter.
0.3601 + 1e-4in floating point is not the key0.3602, so only exact keys matched. When the redesign put a vertex on a rounding boundary, it reported a phantom weight loss (exit 18, w_err 1.0, measured on 5.2.1). Lookups now usekeys_near(): the exact key first, then 26 rounded neighbours.got_wkept only the last re-imported vertex per position. The exporter splits vertices per normal, and each copy has its own JOINTS_0/WEIGHTS_0. The weight falsifier (one weight nudged to 0.99) fell through to exit 19 instead of 18. Every copy is now compared.Asset-sheet tooling:
scripts/asset_sheet.pygains a SELECT row for this example.scripts/asset_sheet_panel.pynow bakes an Armature-deformed asset's staged pose before it removes the rig; without the bake, a skinned asset renders in rest pose (the scorpion with its tail stretched flat). None of the five current references is skinned, so their panels are unchanged.Gates
Framing (5.2.1 and 4.5.11): fill x 0.856, y 0.589, minimum margin 0.072. No deviation.
Asset floors: no default names; 5 materials; edge90 0.001 (16/10946); no degenerate faces.
Contact sheet: docs/gallery/contact-sheets/gltf-skin-roundtrip-contact-sheet.webp
Per-criterion verdicts:
Asset sheet: docs/gallery/asset-sheets/gltf-skin-roundtrip.webp. The scorpion is shown against the current reference set (collision-hull-proxy, socket-attach-points, vertex-color-ao, wheelbarrow, apothecary-shelf). Verdict: passes, mid-lineup.
Drift:
measure_hero_drift.py --only gltf-skin-roundtripgives mean_abs 0.0037: matches.Generated HTML: the card
<img alt>and detail page carry the full new alt. The witnesses callout carries "21 bones … 6.0e-07" untruncated.Check runs (exact binaries, versions they report)
Binaries:
E:\Blender-Developer-Tools\.scratch\blender-4.5.11-windows-x64\blender.exe, which reports Blender 4.5.11 LTS...blender-5.1.2-windows-x64\blender.exe, which reports Blender 5.1.2...blender-5.2.1-windows-x64\blender.exe, which reports Blender 5.2.1 LTS--no-skins--outputrender_hero.py)Measured values are identical on all three binaries:
tests/smoke/run_example.py --forbid-skipgives PASS on 5.2.1 and 4.5.11.Falsifiers
Each probe is a scratch copy with one line broken, run on 4.5.11, 5.1.2 and 5.2.1 with identical results:
export_skins=False(--no-skins)Proven by live run vs inspection only
Proven by live run:
Inspection only:
--outputpath (not run);🤖 Generated with Claude Code