You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 74813ec
Browse filesBrowse the repository at this point in the historyBrowse files
fix(snippets): export Y-up, meter glTF for Godot and Unreal too (#417)
The Godot preset exported Z-up glTF (export_yup=False) and the Unreal
glTF preset baked a 100x scale. Both contradict the glTF 2.0 spec (+Y up,
meters) and the engines: Godot is Y-up and imports glTF per the spec, so
every Godot asset arrived rotated -90 deg about X; Unreal's glTF importer
already converts meters to centimeters (Interchange import_scale defaults
to 100), so a baked file landed 100x too large. The Z-up choice was
justified in the skill only as keeping the axis test from being
"untestable".
All three engine glTF presets are now the same spec-compliant export
(export_yup=True, meters). Engine differences are documented where they
really live: Godot's node-name import hints (-convcolonly, -colonly,
-rigid) and Unreal's FBX axis_forward/axis_up/global_scale, which is
unchanged. The pipeline template's --preset now selects the same export
for every engine.
examples/export-preset-axis keeps its checks and still image but stops
calling the lying mast "Godot": it now contrasts the engine preset with a
naive export_yup=False file, which is what any glTF engine would show.
Closes#346
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
| engine-export-presets | Unity, Godot and Unreal presets: glTF is +Y up and meters for every engine (export_yup=True; Unreal converts to cm on import), FBX uses axis_forward/axis_up plus centimeter scale|
Copy file name to clipboardExpand all lines: ROADMAP.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -98,7 +98,7 @@ Provider-agnostic GLB-in / engine-ready-out. This repo does not generate meshes.
98
98
99
99
-**Post-generation cleanup skills.** Import and unit-scale normalization, transform apply and origin, poly-budget decimate, LOD chain, collision mesh. Phase 1 shipped in v0.54.0 as `ai-mesh-cleanup`, four snippets, two rules.
100
100
-**High-to-low normal bake.****Delivered.** Skill `bake-high-to-low`, snippets `setup_bake_target_image.py` / `bake_normal_high_to_low.py` / `save_baked_image.py`, witness `examples/bake-normal-high-to-low/`. Cycles CPU cage bake; statistical gates, not byte-identity. UV transfer and atlas packing remain a later phase. Template integration remains a later phase.
101
-
-**Engine export presets.****Delivered.** Unity (Y-up glTF), Godot (Z-up glTF, meters), Unreal (centimeter glTF bake and FBX `global_scale`). Skill `engine-export-presets`, three snippets, rule `use-correct-axis-rna-per-exporter`, witness `examples/export-preset-axis/`. Draco remains opt-in via `gltf_draco_export.py`.
101
+
-**Engine export presets.****Delivered.** Unity, Godot and Unreal glTF are one spec-compliant export (+Y up, meters; Unreal converts to cm on import, corrected in #346), and Unreal FBX carries `axis_forward`/`axis_up` plus `global_scale`. Skill `engine-export-presets`, three snippets, rule `use-correct-axis-rna-per-exporter`, witness `examples/export-preset-axis/`. Draco remains opt-in via `gltf_draco_export.py`.
102
102
-**`ai-asset-pipeline-template/`.****Delivered.** Third template. Headless: GLB path in; LOD set, convex or box collider, engine-preset export; explicit CI exit codes. Pattern: `templates/headless-batch-script-template/`.
103
103
-**Live-session agent bridge.** Research spike, not a committed deliverable. MCP server or socket listener so an agent can execute against a running Blender instance instead of blind `--background` scripts. Built on `templates/extension-addon-template/`. Needs its own design pass. Unpinned.
<imgsrc="../assets/export-preset-axis-hero-640.webp" srcset="../assets/export-preset-axis-hero-640.webp 640w, ../assets/export-preset-axis-hero.webp 1280w" sizes="(min-width: 560px) 340px, 100vw" 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." width="1280" height="720" loading="lazy" decoding="async" />
118
+
<imgsrc="../assets/export-preset-axis-hero-640.webp" srcset="../assets/export-preset-axis-hero-640.webp 640w, ../assets/export-preset-axis-hero.webp 1280w" sizes="(min-width: 560px) 340px, 100vw" alt="Two re-imports of a red-and-white radio mast with axis gizmos: the engine-preset copy stands with blue Z up, the naive Z-up copy lies on the floor with green Y up and blue Z along the mast." width="1280" height="720" loading="lazy" decoding="async" />
<p>A radio mast exported under Unity and Godot glTF presets and re-imported, proving the two files have different vertex orientation</p>
122
+
<p>A radio mast exported once with the engine glTF preset (export_yup=True, shared by Unity, Godot and Unreal) and once naively Z-up, then re-imported: the Z-up file lies on its back</p>
<spanclass="card-link" aria-hidden="true">View example →</span>
450
450
</div>
451
451
</article>
452
-
<articleclass="card" data-tags="export" data-kind="examples" data-name="export-preset-axis" data-search="export preset axis export-preset-axis a radio mast exported under unity and godot gltf presets and re-imported, proving the two files have different vertex orientation export ">
452
+
<articleclass="card" data-tags="export" data-kind="examples" data-name="export-preset-axis" data-search="export preset axis export-preset-axis a radio mast exported once with the engine gltf preset (export_yup=true, shared by unity, godot and unreal) and once naively z-up, then re-imported: the z-up file lies on its back export ">
453
453
<divclass="card-media">
454
-
<imgsrc="assets/export-preset-axis-hero-640.webp" srcset="assets/export-preset-axis-hero-640.webp 640w, assets/export-preset-axis-hero.webp 1280w" sizes="(min-width: 900px) 340px, (min-width: 560px) 50vw, 100vw" 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." width="1280" height="720" loading="lazy" decoding="async" />
454
+
<imgsrc="assets/export-preset-axis-hero-640.webp" srcset="assets/export-preset-axis-hero-640.webp 640w, assets/export-preset-axis-hero.webp 1280w" sizes="(min-width: 900px) 340px, (min-width: 560px) 50vw, 100vw" alt="Two re-imports of a red-and-white radio mast with axis gizmos: the engine-preset copy stands with blue Z up, the naive Z-up copy lies on the floor with green Y up and blue Z along the mast." width="1280" height="720" loading="lazy" decoding="async" />
<pclass="teaches">A radio mast exported under Unity and Godot glTF presets and re-imported, proving the two files have different vertex orientation</p>
460
-
<pclass="witnesses"><spanclass="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>
459
+
<pclass="teaches">A radio mast exported once with the engine glTF preset (export_yup=True, shared by Unity, Godot and Unreal) and once naively Z-up, then re-imported: the Z-up file lies on its back</p>
460
+
<pclass="witnesses"><spanclass="tag">witnesses</span>The engine preset (export_yup=True) round-trips standing (x,y,z); a naive export_yup=False file reimports lying along -Y as (x,-z,y), as it would in any glTF engine; --same-axis exits 9; exporter RNA is guarded so a future kwarg rename fails loudly</p>
461
461
<spanclass="card-link" aria-hidden="true">View example →</span>
0 commit comments