Import a Bake3D animated GLB into Unreal Engine 5

Import a Bake3D animated GLB or FBX into Unreal Engine 5 with the editor scripts or Interchange, then check units, facing, root motion and playback.

By the Bake3D teamUpdated 7 min read

Short answer

To import an animated GLB into Unreal Engine 5, use the Interchange importer by adding the file to the Content Browser, or use the Bake3D editor scripts from the Tools menu. Unreal creates a skeletal mesh, a skeleton and animation sequences. Check the scale, the facing direction and root motion, then play each sequence.

How we checked this: The editor scripts run in CI against a stubbed unreal module and a local stand-in for Bake3D. The tests cover uploads, background polling, downloads, Interchange import options, unique folders, root-motion flags and the option dialogs. The scripts have not run inside Unreal Editor. Interchange's handling of Bake3D skins, textures, clips, asset names, facing 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 scripts, the manual import, and 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 scripts target UE 5.3 or newer. Those versions bundle Python 3.9 or later, which is the scripts’ floor. They use only the Python standard library and Unreal’s unreal module.

Install the Bake3D scripts

Download bake3d-unreal.zip and unzip it at your project root. It adds bake3d_unreal.py, bake3d_client.py and bake3d_unreal_menu.py to Content/Python, which Unreal adds to Python’s import path. Add the line import bake3d_unreal to Content/Python/init_unreal.py to get a Tools → Bake3D menu when the editor starts. You can also run that line once in the Output Log’s Python console.

Choose Tools → Bake3D → Set API key and paste a key from Account → API (Pro or Studio). You can also start the editor with BAKE3D_API_KEY in its environment. The key is held in memory for the current session. The scripts never write it to disk, project settings or editor configuration.

Generate, animate and import from the Tools menu

Generate character opens an options dialog. Choose an image file (the field has a file picker), paste a public image URL, or describe the subject. Then set the name, whether to skip the free included animation, and the import options. On OK, the script uploads the image and starts one paid generation. It checks the job every four seconds on a worker thread, backs off when rate limited, and stops after 20 minutes. When Import when ready is on, it imports the character when the job succeeds. Results are applied on the game thread by a Slate tick callback, so the editor stays responsive. Progress appears in the Output Log.

Describe motion composes new motion for a project with a length and loop setting and can import it straight away. Import project imports the included animation, a saved animation, a preset or the rest pose. A preset that cannot play on the rig is refused with the reason. Account and credits shows your balance and the current action costs. Stop waiting leaves jobs running on Bake3D; Cancel the running job cancels the last job and refunds its credits.

The same functions are available in the Python console:

import bake3d_unreal
bake3d_unreal.account()                                    # credits, plan and action costs
task = bake3d_unreal.generate(image_path="D:/refs/fox.png", import_when_ready=True)
task = bake3d_unreal.generate(prompt="A ceramic fox", initial_animation=False)   # rig only
bake3d_unreal.wait_for_job(job_id, import_when_ready=True, project_id=project_id)
bake3d_unreal.list_presets(project_id)                     # availability for this rig
bake3d_unreal.animate(project_id, "trot in a circle", duration_seconds=4, import_when_ready=True)
bake3d_unreal.import_character(project_id, preset_id="adaptive-walk", height_meters=0.6)
bake3d_unreal.import_character(project_id, rest_pose=True, background=False)       # blocks; returns asset paths

What an import does

Each import requests a free export and downloads the GLB into Saved/Bake3D. That folder is outside Content, so Unreal never auto-imports the raw file. The script builds an unreal.AssetImportTask with an InterchangeGenericAssetsPipeline and imports into a new folder, /Game/Bake3D/<project>/<Name>_<Motion>, with _2 and later suffixes for repeat imports. It then deletes the download. 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.

Units, facing and height

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 axis change). A 1.8 m character should therefore arrive 180 cm tall. The script leaves the pipeline’s uniform import offset at 1.0 to avoid applying that scale twice.

Five small axis diagrams for glTF, Blender, FBX from our tool, Unity and Unreal Engine, each with its up axis, front direction and unit. A 1.8 m character is 1.8 in glTF, Blender and Unity, and 180 in FBX and Unreal.
glTF counts in metres with Y up. Unreal counts in centimetres with Z up. The importer converts both, so a 1.8 m character arrives 180 units tall.

Bake3D exports are grounded (feet at zero height) and centred on the origin, and they face glTF +Z. After Interchange’s axis change, the character is expected to face +Y, the way the UE mannequin mesh does. A Character Blueprint then turns the mesh component −90° in yaw, as it does for the mannequin. The Import dialog’s yaw option, or yaw_degrees=-90, instead rotates the asset at import so it faces +X. Set Height to scale the export to a real-world height in metres, or leave it at 0 to keep the generated size.

Root motion

Every export’s skeleton starts with motion_root, an unweighted joint on the ground at the origin, which is the skeleton’s root bone in Unreal. With Root motion on, that bone carries only planar travel and heading; the hips keep their bob and jump. The script turns on Enable Root Motion for the imported Animation Sequences, and Force Root Lock is not needed. With Root motion off, motion_root stays still and the clip animates in place, keeping vertical motion such as a jump and wheel roll.

The editor script defaults to in-place motion. The REST export endpoint and the MCP bake3d_export tool default to rootMotion: true. Pass rootMotion: false there for in-place clips. Enable root motion only when your animation system consumes it; otherwise a movement component and the clip can move the character twice.

Import a GLB or FBX manually

Export from Bake3D (MCP or the REST export endpoint) and drag the file 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.

An FBX export (format: "fbx") is in centimetres, Y up, facing +Z, with one take per animation. Enable Force Front X Axis when importing it so the character faces +X.

To practise before you bake, import a free test model. Our free rigged and animated 3D models come as a GLB with every clip and an FBX with the walk, made by the same exporter.

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, plus motion_root. 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. It needs no 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 option dialogs use EditorDialog.show_object_details_view and Python-defined option classes. If an editor build lacks them, the menu tells you to use the console functions instead.
  • Server exports support one skeleton, up to 256 joints, clips up to 30 seconds and source rigs up to 60 MiB (above 24 MiB, textures must be embedded in the GLB binary chunk). 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 and starts a local stand-in for Bake3D (MCP, uploads and signed files). It asserts that the scripts:

  • refuse non-HTTPS origins (except localhost) and require a bk_live_ key;
  • send one initialize per session and upload images as multipart;
  • return from generate before the job finishes, then deliver results through the Slate tick;
  • poll every four seconds and honour Retry-After;
  • stop promptly on Stop waiting and cancel jobs;
  • download only from the Bake3D file endpoint, without the API key, into Saved/Bake3D, and delete the file after import;
  • use the Interchange options above, a unique folder per import and the yaw offset;
  • enable root motion on imported sequences, and refuse presets the rig cannot play;
  • report a missing glTF translator clearly and drive the three dialogs;
  • never persist the key.

No Unreal Editor was available on the validation machine. The dialogs, Interchange’s handling of Bake3D’s skins, embedded textures and clips, the resulting asset names, the facing 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.

About this guide

Written and kept up to date by the Bake3D team. We build a tool that turns one image into a textured, rigged and animated 3D model, and we test the steps in our guides on our own files. First published . See how we write and check guides, or send a correction to hello@bake3d.ai.