Skip to content

Commit eb7d30d

Browse files
TMHSDigitalclaude
andcommitted
fix(examples): redesign export-preset-axis as a banded radio mast with measured axis gizmos
The review judged the hero weak: dim olive-on-grey, a thin undesigned pole with a box, and the Godot copy lying sideways read as "fell over" rather than as an axis convention. - The source is now a modelled radio mast: stepped chamfered concrete footing, bolted flange, tapered mast in red/white aviation bands with steel collars, three sector panels, a shrouded microwave dish on a raked arm, an equipment cabinet, and a red obstruction lamp under a lightning rod whose point is the witnessed tip vertex. Eight materials. - Each re-import gets a modelled X/Y/Z gizmo. The frame is measured, not placed: the render path picks the axis-aligned rotation mapping source vertices onto the re-import (fit_err printed; exit 12 above 1 mm). Unity shows blue Z up; Godot shows green Y up and blue Z along the lying mast. - The camera looks along +X so the lying mast shows its full length. - The render path now runs gallery_asset_quality (exit 11). The check contract is unchanged; the same checks pass on 4.5.11, 5.1.2 and 5.2.1, and --same-axis still exits 9. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
1 parent 16f9b65 commit eb7d30d

10 files changed

Lines changed: 638 additions & 142 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -850,13 +850,13 @@ byte-identical on 4.5.11 and 5.1.2 and guarded against future renames.
850850
</tr>
851851
<tr>
852852
<td width="46%" valign="middle">
853-
<a href="examples/export-preset-axis/"><img src="examples/export-preset-axis/preview.webp" alt="Export preset axis: a radio beacon exported under Unity and Godot glTF presets and re-imported side by side on a dark studio floor - Unity standing with a glowing cap, Godot lying on its base - proving the two files have different vertex orientation" /></a>
853+
<a href="examples/export-preset-axis/"><img src="examples/export-preset-axis/preview.webp" alt="Export preset axis: a red-and-white radio mast exported under Unity and Godot glTF presets and re-imported side by side on a dark studio floor, each beside a red-green-blue axis gizmo - Unity standing with blue Z up, Godot lying with green Y up and blue Z along the mast - proving the two files have different vertex orientation" /></a>
854854
</td>
855855
<td valign="middle">
856856

857857
### [export-preset-axis](examples/export-preset-axis/)
858858

859-
The same beacon mesh under the Unity (`export_yup=True`) and Godot
859+
The same radio-mast mesh under the Unity (`export_yup=True`) and Godot
860860
(`export_yup=False`) glTF presets. Re-importing each file proves the axis
861861
conversion: Unity stands, Godot lies along `-Y`. `--same-axis` exports both
862862
Y-up and the differ check exits 9. Neighbor of
29.3 KB
Loading
12.9 KB
Loading
5.78 KB
Loading

‎docs/gallery/export-preset-axis/index.html‎

Lines changed: 311 additions & 72 deletions
Large diffs are not rendered by default.

‎docs/gallery/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -618,11 +618,11 @@ <h2><a href="gltf-export-roundtrip/">gltf-export-roundtrip</a></h2>
618618
</article>
619619
<article class="card" data-tags="export">
620620
<a class="card-media" href="export-preset-axis/" tabindex="-1" aria-hidden="true">
621-
<img src="assets/export-preset-axis-hero.webp" alt="Two copies of a lamp-post beacon: the left one standing upright, the right one lying on its side." loading="lazy" decoding="async" />
621+
<img src="assets/export-preset-axis-hero.webp" alt="Two re-imports of a red-and-white radio mast with axis gizmos: the Unity copy stands with blue Z up, the Godot copy lies on the floor with green Y up and blue Z along the mast." loading="lazy" decoding="async" />
622622
</a>
623623
<div class="card-body">
624624
<h2><a href="export-preset-axis/">export-preset-axis</a></h2>
625-
<p class="teaches">A radio beacon exported under Unity and Godot glTF presets and re-imported, proving the two files have different vertex orientation</p>
625+
<p class="teaches">A radio mast exported under Unity and Godot glTF presets and re-imported, proving the two files have different vertex orientation</p>
626626
<p class="witnesses"><span class="tag">witnesses</span> Unity export_yup=True round-trips standing (x,y,z); Godot export_yup=False reimports lying along -Y as (x,-z,y); --same-axis exits 9; exporter RNA is guarded so a future kwarg rename fails loudly</p>
627627
<a class="card-link" href="export-preset-axis/">View example<span class="sr-only"> export-preset-axis</span> <span aria-hidden="true">&rarr;</span></a>
628628
</div>

‎examples/export-preset-axis/README.md‎

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Export Preset Axis
22

3-
A runnable example that exports the same radio-beacon mesh under the Unity
3+
A runnable example that exports the same radio-mast mesh under the Unity
44
and Godot glTF presets from
55
[`engine-export-presets`](../../skills/engine-export-presets/SKILL.md) and
66
re-imports both files. The check is on coordinates, not a screenshot: Unity
@@ -26,8 +26,25 @@ vs Z-up on disk for one file) and [`unapplied-scale-gltf`](../unapplied-scale-gl
2626
(`export_apply` is modifiers, not object scale). This example names the
2727
Unity vs Godot presets and asserts the re-imported orientations diverge.
2828

29-
The still stages the two reimports side by side: standing Unity left, lying
30-
Godot right. If `export_yup` were the same on both, the pair would match.
29+
The subject is a radio mast chosen because "up" is unmistakable on it: a
30+
stepped concrete footing, a bolted base flange, a tapered mast in red and
31+
white aviation bands with steel collars, three sector panel antennas, a
32+
shrouded microwave dish on a raked arm, an equipment cabinet, and a red
33+
obstruction lamp under a lightning rod. The rod's point is the witnessed tip
34+
vertex.
35+
36+
The still stages the two re-imports side by side: the Unity copy standing on
37+
the left, the Godot copy lying along the floor on the right. Beside each sits
38+
a modelled X/Y/Z axis gizmo (red, green, blue) showing that re-import's
39+
frame. The gizmo is measured, not placed: the render path tries all 24
40+
axis-aligned rotations and keeps the one that maps the source vertices onto
41+
the re-imported vertices (worst nearest-vertex distance, printed as
42+
`fit_err`; exit 12 if it exceeds 1 mm). The Unity gizmo comes out as the
43+
identity, blue Z up. The Godot gizmo comes out as `Y -> +Z, Z -> -Y`: green
44+
Y points up and blue Z runs along the lying mast. The mast didn't fall over.
45+
The Godot file stores Z-up coordinates, and the importer reads them as
46+
Y-up. If `export_yup` were the same on both, the two copies and both gizmos
47+
would match.
3148

3249
## Run
3350

@@ -39,14 +56,15 @@ blender --background --python export_preset_axis.py --
3956
blender --background --python export_preset_axis.py -- --same-axis
4057

4158
# Also render a still (EEVEE on a GPU host; use --engine cycles on GPU-less hosts):
42-
blender --background --python export_preset_axis.py -- --output beacon.png
43-
blender --background --python export_preset_axis.py -- --output beacon.png --engine cycles
59+
blender --background --python export_preset_axis.py -- --output mast.png
60+
blender --background --python export_preset_axis.py -- --output mast.png --engine cycles
4461
```
4562

4663
## Exit codes
4764

4865
Per-script sequential checks. `9` is a valid check code; there is no rule
49-
against it. `10` is the shared framing helper.
66+
against it. `10` is the shared framing helper and `11` on the render path is
67+
the shared asset-quality helper.
5068

5169
| Code | Meaning |
5270
| --- | --- |
@@ -61,7 +79,8 @@ against it. `10` is the shared framing helper.
6179
| 8 | Godot reimport is not lying along Y, or reimported tip mismatch |
6280
| 9 | Reimported orientations did not differ (`--same-axis` lands here) |
6381
| 10 | Gallery framing violation |
64-
| 11 | `--same-axis` did not collapse the axis difference |
82+
| 11 | `--same-axis` did not collapse the axis difference; also asset-quality floor violation (render path) |
83+
| 12 | Render path: no axis-aligned rotation maps the source onto a re-import, so the gizmo frame could not be measured |
6584

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

0 commit comments

Comments
 (0)