Import a Bake3D animated GLB into Unreal Engine 5

Use the Bake3D editor Python script or Unreal's Interchange pipeline to turn an animated GLB into a Skeletal Mesh, Skeleton and Animation Sequences, then check units, axes and playback.

By Bake3D · Updated

Testing scope: The editor script's client and import logic are verified in CI against a stubbed unreal module and a local fake MCP server. It has not been run inside Unreal Editor; Interchange's handling of Bake3D skins, textures, clips and unit conversion is described from Epic's documentation and remains unverified on a live project.

A Bake3D export is a glTF 2.0 binary (GLB) with a textured mesh, skin weights, one skeleton and baked animation keyframes. Unreal Engine 5 reads that file through its Interchange framework and produces a Skeletal Mesh, a Skeleton, materials, textures and one Animation Sequence per clip. This guide covers the Bake3D editor script and the manual import, plus the checks to run before an asset reaches an Animation Blueprint.

Prepare the editor

Open Edit → Plugins and enable the Python Editor Script Plugin and Editor Scripting Utilities. Keep the Interchange Framework plugin enabled; it is on by default and supplies the glTF translator. Restart the editor after changing plugins.

The script targets UE 5.3 or newer. Those versions bundle Python 3.9 or later, which is the script’s floor. It uses only the Python standard library and Unreal’s unreal module.

Use the Bake3D editor script

Download bake3d_unreal.py and copy it into your project’s Content/Python folder. Unreal adds that folder to Python’s import path. To get a Tools → Bake3D menu when the editor starts, create Content/Python/init_unreal.py containing the line import bake3d_unreal; otherwise run that line in the Output Log’s Python console.

Provide a key from Account → API (Pro or Studio). Either start the editor with BAKE3D_API_KEY in its environment, or run bake3d_unreal.set_api_key("bk_live_...") in the console. The key is held in memory for the current session; the script never writes it to disk, project settings or editor configuration.

The console functions mirror the Blender add-on:

import bake3d_unreal
bake3d_unreal.list_projects("fox")                       # free
job = bake3d_unreal.generate(prompt="A ceramic fox standing on four legs")   # 35 credits
bake3d_unreal.wait_for_job(job["jobId"])                 # polls; blocks the editor until done or cancelled
bake3d_unreal.list_animations(job["projectId"])          # saved clips: id, name, duration, kind
bake3d_unreal.list_presets()                             # built-in motion IDs
bake3d_unreal.import_character(job["projectId"])                           # included initial motion
bake3d_unreal.import_character(job["projectId"], animation_id="...")       # a saved animation
bake3d_unreal.import_character(job["projectId"], preset_id="tail-wag")     # a preset, free
bake3d_unreal.import_character(job["projectId"], rest_pose=True)           # rigged, unanimated

generate accepts exactly one of prompt or image_url and starts a paid job; call it once per intended result. wait_for_job shows a progress dialog whose Cancel button stops waiting without cancelling the job on Bake3D. Each import_character call requests a free export, downloads the GLB into Content/Bake3D with a unique file name, and imports it into /Game/Bake3D.

The Tools → Bake3D menu covers the paths that need no typed input: setting up the key, reading the account, listing rigged projects, and importing the most recently updated rigged project with its included motion or as a rest pose.

What the import task requests

The script builds an unreal.AssetImportTask with an InterchangeGenericAssetsPipeline as its options. It asks for skeletal meshes rather than static meshes, keeps animation import and bone tracks on, imports materials and textures, and skips physics-asset creation. If the glTF translator class is missing, the script stops before importing, keeps the downloaded file and names the plugin to enable.

Import a GLB manually through Interchange

Export the GLB from Bake3D (MCP or the REST export endpoint) and drag it into the Content Browser, or use Import in the folder you want. Unreal opens the Interchange import dialog.

In the dialog, confirm that skeletal mesh import is on and that static-mesh conversion is off, enable animation import, and keep materials and textures enabled. Bake3D rigs are generic skeletons, so leave the Skeleton field empty for a first import; Interchange creates one. Epic’s Interchange import reference documents every option in the dialog.

After import, expand the folder to find the Skeletal Mesh, Skeleton, Animation Sequence, materials and textures. Open the Animation Sequence and scrub the full range.

Units and axes

glTF stores positions in metres with Y up. Unreal uses centimetres with Z up. Interchange’s glTF translator performs both conversions during import (a uniform scale of 100 and a Y-up to Z-up rotation), so a 1.8 m character should arrive 180 cm tall. The Bake3D script leaves the pipeline’s uniform import offset at 1.0 to avoid applying that scale twice. If a character imports 100 times too small or too large, check the import offset in the pipeline before changing the source.

The same applies to baked root travel. Bake3D exports in-place motion by default; enable root travel only when your animation system consumes it, otherwise a movement component and the clip can move the character twice.

Check the result

Place the Skeletal Mesh in a level next to a known reference such as a 180 cm mannequin. Open the Skeleton and confirm the joint count matches the project’s labelled skeleton in Bake3D. Play the Animation Sequence and watch every appendage, the loop boundary, and the texture. A multi-legged creature, a vehicle or a prop keeps its own hierarchy; there is no need for a humanoid retargeting setup unless you intend to share animations with a humanoid rig.

Unreal uses linear blend skinning. Bake3D’s web preview can use a dual-quaternion shader that is not part of glTF, so deformation near tightly bending joints can look different in Unreal. Use the rig quality checklist when something looks wrong, and compare the same GLB in Blender to separate a source-asset problem from an importer difference.

Limitations

  • The script blocks the editor while it polls a job or downloads a file. Generation can take several minutes; the Cancel button in the progress dialog releases the editor without stopping the job.
  • Unreal has no stock text-input dialog exposed to Python, so prompts, IDs and keys are entered in the Python console rather than a panel. The menu covers the no-input paths only.
  • Server exports support one skeleton, up to 256 joints, clips up to 30 seconds and source files up to 24 MiB. Downloads are capped at 64 MiB in the editor.
  • Interchange property names vary slightly between engine versions. The script logs a warning for any option it could not apply rather than failing the import.

What we verified and what we did not

The verification script runs in CI on every change. It installs a stub unreal module, starts a local fake MCP server and signed-file endpoint, and asserts that the client refuses non-HTTPS origins (except localhost), requires a bk_live_ key, sends initialize before tools/call, passes the expected export arguments for saved animations, presets, rest pose and the included motion, downloads only from the Bake3D file endpoint without the API key, writes unique GLBs under Content/Bake3D, creates an AssetImportTask aimed at /Game/Bake3D with the Interchange options above, reports a missing glTF translator clearly, registers a five-entry Tools → Bake3D menu, and never persists the key.

No Unreal Editor was available on the validation machine. Running the script inside UE 5.3 or newer, Interchange’s handling of Bake3D’s skins, embedded textures and animation clips, the resulting asset names, and the unit conversion described above remain unverified. Epic’s Python scripting documentation and the Interchange framework overview are the references for that work. Treat the first import in your project as a test, not a finished pipeline.