Skip to content

Commit 2873914

Browse files
TMHSDigitalclaude
andauthored
fix(examples): redesign prop-origin-transform as a street utility pedestal with a thrown conduit elbow (#267)
* fix(examples): redesign prop-origin-transform as a street utility pedestal with a thrown conduit elbow The gallery review judged the hero programmer art: two teal boxes with grey cylinders, cryptic TRAP / MPI KEEP floor text and unexplained tick marks. The pedestal is now a designed prop in five materials: concrete footing, galvanised base plate and anchor nuts, cabinet with kick skirt, hipped lid, hinged door with a T-handle and hazard plate, louvred vents, a conduit boss and a pad sleeve. It is authored as an import arrives (centred origin, mesh divided by a non-uniform object scale), so the data-API bake lands on exactly the designed shape. The accessory is a flanged PVC conduit elbow with a clamp and a coupling that seats in the sleeve. The composition drops all text. The left copy is parented with MPI and seated. On the right copy, bare child.parent throws the elbow 0.65 m into the air past the slab edge, and a glowing cyan wireframe ghost marks the seat it left. Floor pivot rings centred on each origin replace the axis stubs. The render path now runs the gallery_asset_quality gate too, and asset_sheet.py gains a SELECT row for the asset. Check logic and thresholds are unchanged. The documented numbers move with the new mesh: bare jump 0.298 m, and min.z -0.58 without the origin bake. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix(examples): shorten prop-origin-transform alt and regenerate gallery build_gallery caps card alts at 200 chars; the redesign alt was 333. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> --------- Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 8c4b9e0 commit 2873914

11 files changed

Lines changed: 867 additions & 561 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,7 +1010,7 @@ still: DIRTY through-hole + loose-vert bead vs CLEAN manifold (same brass).
10101010
</tr>
10111011
<tr>
10121012
<td width="46%" valign="middle">
1013-
<a href="examples/prop-origin-transform/"><img src="examples/prop-origin-transform/preview.webp" alt="Prop origin transform: dual-panel TRAP vs MPI KEEP street pedestals with margins all around — left bare-parent conduit accessory teleports off its dark mount well, right accessory stays seated, origin axes crossing on the floor under each base — proving scale apply, base origin, and matrix_parent_inverse" /></a>
1013+
<a href="examples/prop-origin-transform/"><img src="examples/prop-origin-transform/preview.webp" alt="Prop origin transform: two green street utility pedestals, each centred in a floor pivot ring — left, the orange conduit elbow parented with matrix_parent_inverse stays bolted to its mount; right, bare child.parent = parent throws the elbow into the air beyond the slab while a glowing cyan outline marks its empty seat — proving scale apply, base origin, and matrix_parent_inverse" /></a>
10141014
</td>
10151015
<td valign="middle">
10161016

@@ -1019,7 +1019,7 @@ still: DIRTY through-hole + loose-vert bead vs CLEAN manifold (same brass).
10191019
The origin / scale-apply / MPI contract a prop pipeline relies on before
10201020
engine ingest: data-API scale bake to exactly `(1,1,1)`, local bbox
10211021
`min.z == 0` (origin at base), world AABB unchanged across the bake, and
1022-
`matrix_parent_inverse` so a flanged conduit stays on its mount socket.
1022+
`matrix_parent_inverse` so a flanged conduit elbow stays on its mount.
10231023
Extends [`parent-inverse-orrery`](examples/parent-inverse-orrery/) without
10241024
retreading orbits. Dual-panel still: TRAP (bare parent — empty socket +
10251025
teleported flange) vs MPI KEEP.
52.9 KB
Loading
19.6 KB
Loading
-4.99 KB
Loading

‎docs/gallery/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -750,11 +750,11 @@ <h2><a href="mesh-hygiene-audit/">mesh-hygiene-audit</a></h2>
750750
</article>
751751
<article class="card" data-tags="transforms parenting game-pipeline">
752752
<a class="card-media" href="prop-origin-transform/" tabindex="-1" aria-hidden="true">
753-
<img src="assets/prop-origin-transform-hero.webp" alt="Two teal pedestals labelled TRAP and MPI KEEP, origin axes crossing on the floor under each base: on the left a conduit fitting has jumped out of its socket, on the right it sits seated." loading="lazy" decoding="async" />
753+
<img src="assets/prop-origin-transform-hero.webp" alt="Two green street utility pedestals in floor pivot rings: the left one keeps its orange conduit elbow bolted on, the right one&#x27;s elbow hangs in the air beside a glowing cyan outline of its seat." loading="lazy" decoding="async" />
754754
</a>
755755
<div class="card-body">
756756
<h2><a href="prop-origin-transform/">prop-origin-transform</a></h2>
757-
<p class="teaches">Street pedestal origin-to-base-center + data-API scale apply + matrix_parent_inverse for a flanged conduit accessory. After bake: scale (1,1,1), local min.z==0, world AABB unchanged. Bare parent jumps the accessory off an empty mount socket; MPI keeps it seated.</p>
757+
<p class="teaches">Street pedestal origin-to-base-center + data-API scale apply + matrix_parent_inverse for a flanged conduit elbow. After bake: scale (1,1,1), local min.z==0, world AABB unchanged. Bare parent throws the elbow off its mount; MPI keeps it seated.</p>
758758
<p class="witnesses"><span class="tag">witnesses</span> Bare child.parent = parent teleports accessories off their mounts; skipping view_layer.update() before matrix_world, or leaving non-uniform scale / centered origin, breaks engine ingest placement.</p>
759759
<a class="card-link" href="prop-origin-transform/">View example<span class="sr-only"> prop-origin-transform</span> <span aria-hidden="true">&rarr;</span></a>
760760
</div>

‎docs/gallery/prop-origin-transform/index.html‎

Lines changed: 423 additions & 277 deletions
Large diffs are not rendered by default.

‎examples/gallery.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -501,8 +501,8 @@
501501
{
502502
"name": "prop-origin-transform",
503503
"dir": "examples/prop-origin-transform",
504-
"teaches": "Street pedestal origin-to-base-center + data-API scale apply + matrix_parent_inverse for a flanged conduit accessory. After bake: scale (1,1,1), local min.z==0, world AABB unchanged. Bare parent jumps the accessory off an empty mount socket; MPI keeps it seated.",
505-
"alt": "Two teal pedestals labelled TRAP and MPI KEEP, origin axes crossing on the floor under each base: on the left a conduit fitting has jumped out of its socket, on the right it sits seated.",
504+
"teaches": "Street pedestal origin-to-base-center + data-API scale apply + matrix_parent_inverse for a flanged conduit elbow. After bake: scale (1,1,1), local min.z==0, world AABB unchanged. Bare parent throws the elbow off its mount; MPI keeps it seated.",
505+
"alt": "Two green street utility pedestals in floor pivot rings: the left one keeps its orange conduit elbow bolted on, the right one's elbow hangs in the air beside a glowing cyan outline of its seat.",
506506
"witnessesFix": "Bare child.parent = parent teleports accessories off their mounts; skipping view_layer.update() before matrix_world, or leaving non-uniform scale / centered origin, breaks engine ingest placement.",
507507
"hero": "docs/gallery/assets/prop-origin-transform-hero.webp",
508508
"preview": "examples/prop-origin-transform/preview.webp",

‎examples/prop-origin-transform/README.md‎

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Prop Origin Transform
22

3-
A runnable example that builds a street utility pedestal with a bolted
4-
conduit accessory and proves the **origin / scale-apply / MPI** contract a
3+
A runnable example that builds a street utility pedestal with a flanged
4+
conduit elbow and proves the **origin / scale-apply / MPI** contract a
55
prop pipeline relies on before engine ingest — following
66
[`operators`](../../skills/operators/SKILL.md) and the data-API parenting
77
idiom from [`parent-inverse-orrery`](../parent-inverse-orrery/).
@@ -27,24 +27,37 @@ engine exporter — it proves the transform properties such an asset must have.
2727
- **Origin at base center.** Local bbox `min.z == 0`, XY centered; world AABB
2828
delta across the bake is **0** (gate `1e-5`).
2929
- **Bare-parent trap.** Parenting the accessory without MPI jumps it
30-
(~0.43 m measured); setting `matrix_parent_inverse` restores world location
31-
(err ~3e-8).
30+
(0.298 m measured); setting `matrix_parent_inverse` restores world
31+
location (err 0).
3232

3333
**What each check catches on failure:** skipping scale apply leaves
34-
non-identity scale; skipping origin bake leaves `min.z ≈ -0.756`; skipping
35-
MPI leaves the accessory teleported.
34+
`(1.15, 0.92, 1.08)` (exit 5); skipping the origin bake leaves
35+
`min.z = -0.58` (exit 6); skipping MPI leaves the accessory 0.298 m off
36+
(exit 8).
3637

37-
**Version witness:** byte-identical numbers on Blender 4.5.11 LTS and 5.1.2.
38+
**Version witness:** identical numbers on Blender 5.2.1 LTS, 5.1.2 and
39+
4.5.11 LTS.
3840

39-
The render is a dual panel: left **TRAP** (bare parent — flanged conduit
40-
teleports off a deep shadowed mount socket) vs right **MPI KEEP** (same metal
41-
fitting seated in the socket), with emissive origin markers at each pedestal's
42-
base. The origin is inside the plinth, so the red X and green Y stubs are
43-
centred on it and run 1.7 m along the floor, exiting the plinth on both
44-
sides: where they cross, under the base, is the origin. The first cut drew
45-
0.28 m stubs from the origin outward, all buried, and 0.11 m labels that
46-
vanished at card size; the labels are 0.21 m now. Accessory and pedestal stay in one material family so displacement — not
47-
color — carries the proof. Check closed forms are unchanged.
41+
**The asset.** The pedestal is one mesh with five materials: a precast concrete footing,
42+
a galvanised base plate with anchor nuts, a green cabinet on a black kick
43+
skirt, a hipped lid, a door with hinges, a T-handle and a hazard plate, louvred
44+
side vents, a conduit boss on the +X face and a sleeve in the pad. It is
45+
authored the way an import often arrives: origin at the geometric centre and
46+
coordinates divided by a non-uniform object scale. The bake lands it on
47+
exactly the designed shape. The accessory is a flanged PVC conduit elbow
48+
with bolt heads, a strap clamp and a coupling that drops into the sleeve.
49+
50+
**The render.** Two baked pedestals stand on a sidewalk slab. On the left the elbow is
51+
parented with MPI and stays bolted to its boss, seated in the sleeve. On the
52+
right, bare `child.parent = parent` applies the pedestal's transform a
53+
second time. The elbow is thrown 0.65 m, past the slab edge and into the
54+
air, and a glowing cyan outline (a Wireframe modifier on a copy)
55+
marks the seat it left. The slab raises both origins 0.20 m, so the doubled
56+
translation lifts the elbow instead of sliding it along the floor. A
57+
pivot ring on the floor is centred on each pedestal's origin, with red
58+
notches on its X axis and green notches on Y. The origin is under the base,
59+
so the ring frames it. There are no text labels: the ghost and the stranded
60+
elbow carry the proof. The check's closed forms are unchanged.
4861

4962
## Run
5063

@@ -73,6 +86,7 @@ against it. `10` is the shared framing helper.
7386
| 8 | MPI did not restore world location (`--skip-mpi` lands here) |
7487
| 9 | `--output` produced no file |
7588
| 10 | Gallery framing violation |
89+
| 11 | Gallery asset-quality violation (render path only) |
7690

7791
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
7892
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
18.3 KB
Loading

0 commit comments

Comments
 (0)