← Back to Blog tutorials

Why Godot models import facing the wrong direction (and the fix)

By BitSoul Team9/20/20265 min read5 views
Why Godot models import facing the wrong direction (and the fix)

Your model imports into Godot facing the wrong direction, lying on its side, or scaled to fill half the viewport — even though it looked correct in Blender's own viewport right before export. That's not a Godot bug. Three causes cover almost every case: unapplied transforms baked into the glTF export, a bone roll mismatch on the armature, or a root-scale conflict between Blender's unit scale and whatever the asset was actually modeled at. Two of the three fix in Blender with a single menu command; the third fixes from Godot's own Import dock without touching the source file at all.

Why models import facing the wrong direction

Why models import facing the wrong direction — illustrated

Blender's viewport is Z-up. glTF — and Godot 4.7 with it — is Y-up. Blender's own exporter handles that conversion automatically through the `+Y Up` option in the export panel's Transform section, on by default. The failures people hit aren't the axis conversion itself; they're everything sitting on top of it — an object carrying rotation or scale values in its Transform panel that were never baked into the mesh data. Those values ride along into the export and get reinterpreted through the coordinate swap, which is why the result usually lands on a clean 90° or 180° rather than some random angle. That clean-number rotation is the tell you're looking at an unapplied transform, not a corrupt file.

Match the symptom to the cause

| Symptom | Likely cause | Fix |
|---|---|---|
| Model lies on its side or back; mesh looks fine in Blender | Unapplied rotation on the object | `Object > Apply > All Transforms` in Blender before export |
| Model imports 50–100x too large or too small | Blender scene's unit scale doesn't match the asset | Enable Apply Root Scale in Godot's Import dock, or fix Scene Properties > Unit Scale in Blender |
| Individual limbs twist on some animation frames; rest pose looks right | Bone roll mismatch across the armature | Edit Mode on the armature, select all bones, `Armature > Bone Roll > Recalculate Roll` (Shift+N) |
| Whole rig off by 90°; static meshes in the same file import fine | Root node carrying a stray transform that wasn't baked | Set Root Type in the Import dock, then Reimport |

Fix it in Blender first

Select everything you're about to export (`A` in the 3D viewport), then `Object > Apply > All Transforms`. Check the N-panel: Rotation should read 0, 0, 0 and Scale 1, 1, 1 — position can stay wherever it is. Re-export through `File > Export > glTF 2.0 (.glb/.gltf)` and confirm `+Y Up` is still checked in the Transform section; a handful of older batch-export addons leave it unchecked.

For rigged assets, do the bone pass before you start keying animation, not after. Enter Edit Mode on the armature, select every bone, then `Armature > Bone Roll > Recalculate Roll` and pick one consistent axis for the whole rig. Godot's glTF import silently renames bones and breaks animations covers the companion failure mode, where the importer itself relabels bones on the way in — worth ruling out at the same time.

To batch this across a folder of assets instead of clicking through each one:

```python
# Blender: bake rotation + scale (not location) on every mesh/armature
import bpy
for obj in bpy.data.objects:
obj.select_set(obj.type in {'MESH', 'ARMATURE'})
bpy.context.view_layer.objects.active = bpy.data.objects[0]
bpy.ops.object.transform_apply(location=False, rotation=True, scale=True)
```

Leave `location=False`. Baking location moves the object's origin to world zero, which breaks anything that pivots or snaps around that origin later.

Fix it from Godot's side

Fix it from Godot's side — illustrated

Some of this doesn't need a re-export at all. Select the `.glb`/`.gltf` file in the FileSystem dock, open the Import tab, and check the Nodes section: Root Type controls what kind of node Godot generates as the scene root, and Apply Root Scale bakes the root's scale directly into the meshes and animation tracks while resetting the root node itself back to `(1, 1, 1)`. That second one is the fix for "imports at the wrong size but Blender says everything's fine" — it's a scene unit mismatch, not a bad export. Change the setting, then click Reimport; editing the property alone doesn't retrigger the pipeline, and the old cached import sticks around until you do.

Godot's GLTF importer flattens normal maps: here's the fix walks the same Import tab for a texture-side version of this problem — worth checking in the same pass since you're already there.

Once you've reimported, a runtime check confirms the fix landed instead of just looking right in the editor viewport:

```gdscript
func _ready() -> void:
var model := $ModelRoot # the imported scene's root node
print("rotation: ", model.rotation_degrees)
print("scale: ", model.scale)
# A clean import reads (0,0,0) rotation and (1,1,1) scale here
```

If you want a known-good file to diff a broken import against before pulling apart your own rig, BitSoul's Pilot NPC (Animated) ships with baked transforms and consistent bone roll already, so it imports clean under the same Root Type and Apply Root Scale settings — useful for confirming the problem is your file, not your project's import config. A free account's two monthly downloads cover that kind of evaluation; commercial use is included with paid memberships.

Gotchas that undo the fix

Applying transforms with Location enabled moves the object's origin to world zero — leave it off, as in the script above, for anything that pivots, snaps to a grid, or gets placed procedurally later. Recalculating bone roll after animations already exist can visibly shift those animations, since roll redefines the axis the keyframes rotate around; check every animation state afterward, not just the rest pose. Apply Root Scale bakes the scale into the mesh and leaves the root node reporting `(1, 1, 1)` — if any gameplay script reads that node's `.scale` expecting the original number, it gets 1 back and quietly misbehaves. And Godot's Import tab changes don't take effect until you click Reimport; the inspector will happily show your new setting while the running game still reads the old cached import.

For the export-side version of "looks right in Blender, wrong in-engine," Blender's Boolean and Geometry Nodes disable your UV maps is the same category of bug, one step earlier in the pipeline.

---

*This post is part of the Ultimate Guide to Free 3D Game Assets — BitSoul's complete reference for formats, texturing, rigging, optimization, and engine integration.*

Tags: godot workflow game-assets 3d-models tutorials rigging

Skip the modelling — download it instead

A free BitSoul account gets you 2 models every month plus 25 AI Engine credits to generate one of your own, no card required. Clean topology, PBR textures, and GLB downloads that drop straight into Unreal, Unity, Godot or Blender — OBJ and 3D-printable STL export come with any purchase or paid plan.

Browse 1051 models — from $4.99 → or start free (2 downloads a month)