Quick answer: The most common cause is a mismatch between the rest pose in Blender and what Godot expects. Applying transforms in Blender before export (Ctrl+A > All Transforms) and ensuring bone rolls are consistent resolves most import issues.

Here is how to fix Godot skeletal animation import blender breaks. You modeled a character in Blender, rigged it with an armature, animated a walk cycle, and exported it to Godot. When you play the animation, the mesh twists unnaturally, limbs point in wrong directions, and bones seem to have forgotten their rest pose entirely. This Blender-to-Godot skeletal animation pipeline is notoriously fragile, but the fixes are well-understood once you know what to look for.

The Symptom

After importing a .glb or .gltf file from Blender into Godot 4, the character’s skeletal animation looks broken. Common symptoms include:

The model and animations look perfect in Blender. The problem only appears after import into Godot. Re-exporting with different file formats (FBX, ESCN, DAE) produces different but equally broken results.

What Causes This

Unapplied transforms are the number one cause. In Blender, your armature or mesh object can have transforms (position, rotation, scale) that have not been “applied.” Blender internally separates object-level transforms from mesh-level data. When you export to glTF, these unapplied transforms get baked into the export in ways that Godot interprets differently than Blender. A mesh that looks correct in Blender because Blender is compensating for the unapplied rotation will appear twisted in Godot because Godot applies the transform data literally.

Bone roll mismatches cause axis confusion. Every bone in a Blender armature has a “roll” value that defines its local Z-axis orientation. If bones have inconsistent rolls, the exported animation keyframes rotate around unexpected axes. Blender’s viewport compensates for this visually, but the raw exported data does not.

Scale differences between Blender and Godot. Blender defaults to a 1-unit = 1-meter scale while Godot also uses meters, but many Blender projects change the unit scale or model at a different scale without realizing it. If your Blender scene has a unit scale other than 1.0 or your armature has a non-identity scale, the exported skeleton will be sized incorrectly in Godot.

The -loop suffix is missing on looping animations. Godot’s glTF importer looks for a -loop suffix on animation names to determine whether they should loop. Without it, a walk cycle plays once and stops, which looks like a broken animation even though the data is correct.

The Fix

Step 1: Apply all transforms in Blender. Select the armature object in Object Mode, then select the mesh. Press Ctrl+A and choose All Transforms. This bakes the object-level location, rotation, and scale into the actual data. Do this for both the armature and every mesh object bound to it.

# Blender Python console equivalent
# Select armature and mesh, then:
bpy.ops.object.transform_apply(
  location=True,
  rotation=True,
  scale=True
)

Step 2: Recalculate bone rolls. Enter Edit Mode on the armature. Select all bones with A. Go to Armature → Bone Roll → Recalculate Roll and choose a consistent axis — typically Global +Z Axis or Active Bone if you have a reference bone oriented correctly. This ensures every bone has a predictable local axis orientation.

Step 3: Set the correct export scale. When exporting as glTF 2.0 (.glb), check the export dialog:

Step 4: Name looping animations with the -loop suffix. In Blender’s Action Editor or NLA Editor, rename your looping animations to include the suffix. For example, rename walk to walk-loop, idle to idle-loop, and run to run-loop. Non-looping animations like jump or death should keep their original names.

Step 5: Configure Godot’s import settings. After importing the .glb file, select it in the FileSystem dock and open the Import tab. Under Animation, make sure the rest pose is set correctly. If bones still look wrong, try enabling Retarget → Bone Map and mapping bones manually to Godot’s humanoid skeleton profile.

# Verify the skeleton is correct in GDScript
func _ready():
  var skeleton = $Character/Armature/Skeleton3D
  print("Bone count: ", skeleton.get_bone_count())
  for i in skeleton.get_bone_count():
    var name = skeleton.get_bone_name(i)
    var rest = skeleton.get_bone_rest(i)
    print("Bone %s: rest = %s" % [name, rest])

Step 6: If bones are still broken, re-export with “Rest Position” enabled. In Blender, before exporting, switch the armature to Rest Position mode (in the Object Data Properties panel under Armature → Rest Position). This ensures the export captures the actual rest pose rather than whatever pose was active in Blender at export time.

Why This Works

The glTF format stores bone transforms as absolute values relative to the parent bone. If your Blender armature has unapplied transforms, the exporter writes one set of values while Blender’s viewport displays a different visual result that accounts for those unapplied transforms. Godot reads the raw values and renders them literally, producing the twisted mesh.

Bone roll defines the local coordinate system for each bone. When rolls are inconsistent, rotation keyframes that appear to rotate around the correct axis in Blender actually target a different local axis in the exported data. Recalculating rolls with a consistent algorithm ensures the exported and imported axes match.

The -loop naming convention is a Godot-specific feature built into the glTF import pipeline. Without it, Godot defaults to one-shot playback, and a walk cycle that plays once and stops can easily be mistaken for a broken animation when the real issue is just the loop flag.

Related Issues

If the animation plays correctly but AnimationPlayer property tracks fail to update node properties, see Fix: AnimationPlayer Property Track Not Updating Node Properties.

For AnimationTree blend issues with imported skeletal animations, check Fix: Godot AnimationTree Blend Values Not Transitioning Smoothly — blend spaces may need reconfiguration after re-importing animations.

If you are using sprite-based animation alongside 3D skeletal animation and seeing flickering, see Fix: Sprite Animation Flickering Between Frames in Godot.

Apply transforms. Fix bone rolls. Export as glTF. Every time.