← Back to Blog tutorials

Fix squashed rigs from glTF's 4-bone weight limit

By BitSoul Team8/25/20265 min read3 views
Fix squashed rigs from glTF's 4-bone weight limit

A rigged character looks fine in Blender, then the shoulder pauldron, cape hem, or tail root collapses into itself the moment you drop the GLB into Unity, Godot, or Unreal. The cause is almost always glTF's default skinning attributes: `JOINTS_0` and `WEIGHTS_0` only carry four bone influences per vertex, and the exporter silently keeps the four heaviest weights on any vertex that needed more, renormalizing what's left. Any joint where cloth, armor plates, or a tail base blend five or six bones smoothly in Blender gets crushed down to four the moment you export.

Why glTF caps every vertex at four bones

Why glTF caps every vertex at four bones — illustrated

Blender's Armature modifier doesn't care how many vertex groups deform a vertex — eight, twelve, whatever you painted. The glTF 2.0 spec's base skinning attributes do care: `JOINTS_0` and `WEIGHTS_0` are each a 4-component vector, one slot per influencing bone. That's enough for a simple elbow bend, not enough for a cloak collar where trapezius, neck, and both shoulder bones all contribute, or a dragon tail where three tail bones overlap at every segment.

When Blender's glTF exporter meets a vertex with more than four non-zero weights, its default behavior is to keep the four largest and drop the rest, then renormalize the survivors back to sum to 1.0. Visually, that means the influence that used to soften a joint disappears, and the remaining bones overcorrect — the classic pinch-and-balloon look at shoulders, hips, and tail bases.

The fix isn't a Blender bug workaround so much as a spec feature most people never turn on: glTF supports additional `JOINTS_1`/`WEIGHTS_1` attribute sets (and `_2`, `_3`) that extend a vertex to 8, 12, or 16 influences. Blender can write them. Whether your target engine reads them is a separate question, covered below.

Turning on all bone influences in Blender

Before touching export settings, check what you're actually asking for. In the 3D Viewport, switch to Weight Paint mode on the mesh with the Armature modifier active, and look at any joint that deforms unnaturally — if more than four bones are painted with meaningful weight there, you need the extra attribute sets.

```python
# Run in Blender's Scripting tab: flags vertices needing >4 bone influences
import bpy
obj = bpy.context.object
over = [v.index for v in obj.data.vertices
if len([g for g in v.groups if g.weight > 0.01]) > 4]
print(f"{len(over)} vertices exceed the 4-bone limit")
```

If that count is non-zero, open the glTF export dialog (File > Export > glTF 2.0), expand the Armature section, and enable Include All Bone Influences. This tells the exporter to write however many `JOINTS_n`/`WEIGHTS_n` sets are needed instead of truncating to one. It's off by default because most rigs don't need it and the extra attributes add file size — leave it off for simple props and enable it only for meshes your script above flagged.

One thing to fix before you export, not after: if your mesh is parented directly to the armature object (Ctrl+P > Armature Deform) rather than using an Armature modifier explicitly, Blender's glTF exporter can silently drop bone weights and indices entirely, not just truncate them. Convert to an explicit Armature modifier on the mesh's modifier stack first — it's the same runtime result in Blender, but it's what the exporter actually reads.

Which engines read the extra bones

Which engines read the extra bones — illustrated

Writing `JOINTS_1`/`WEIGHTS_1` only helps if the importer on the other end uses them. This is where the fix falls apart for one major engine:

| Engine | Reads JOINTS_1/WEIGHTS_1? | Practical effect |
|---|---|---|
| Blender (re-import) | Yes | Round-trips correctly |
| Godot 4.x | Yes | Full 8-influence skinning preserved |
| Unity (glTFast / UnityGLTF) | Yes | Full 8-influence skinning preserved |
| Unreal Engine 5 (Interchange importer) | No | Truncates back to 4 influences on import, regardless of source data |

If Unreal is your target, enabling "Include All Bone Influences" in Blender buys you nothing — Interchange throws away the extra sets and you're back to the same squash. The actual fix for UE5 is upstream: reduce the influence count in Weight Paint mode until no vertex needs more than four, using Blender's own Limit Total (Weights > Limit Total, set to 4) so you control which bones get dropped instead of leaving it to the exporter. Do this on a copy — Limit Total is destructive to the weight paint you already did.

For Godot and Unity projects, skip Limit Total entirely and just enable the exporter option; both read the full set natively and the extra joints show up as expected without further engine-side configuration.

Gotchas

Weight normalization is a separate failure mode from truncation. If you hand-painted weights that don't sum to 1.0 per vertex (easy to do with the Draw brush and no auto-normalize), "Include All Bone Influences" exports non-normalized weights, and some engines quietly renormalize on import while others render the mesh as-is, with visibly different results between them for the same file. Turn on Weight Paint's Auto Normalize toggle before your final weight pass, not after.

Armature scale is a related but separate trap — if your rig has non-uniform scale on the armature object itself, bone influences can look correct in Blender and still misbehave after export. That's a different bug with its own fix, covered in why bone scale breaks on import.

Shape keys add a third wrinkle: a mesh with both shape keys and an Armature modifier has its own export order dependency, detailed in why Blender GLB exports lose shape keys with modifiers on. If your squashed-joint character also uses facial shape keys, fix the bone influence count first — shape key corruption can mask whether the weight fix actually worked.

If you're rigging from an AI-generated base mesh rather than painting weights by hand, auto-rig tools generate their own influence counts, and Meshy's 30-second auto-rig defaults to four influences per vertex regardless of mesh complexity, which is worth checking against our test of Meshy 7's auto-rig in Unity and Godot before you assume the rig needs manual fixing at all.

For a reference rig with the kind of overlapping armor-plate deformation that actually needs more than four influences, the Ornate Plate Knight model's pauldron-to-cape transition is a good stress test — export it both ways and compare the shoulder seam in your target engine before committing to a fix strategy on your own rig. A free account's two monthly downloads cover evaluation; commercial use is included with paid memberships — see pricing.

Once you know whether your engine reads the extra joint sets, the decision is mechanical: enable "Include All Bone Influences" for Godot and Unity targets, run Limit Total to 4 before export for Unreal targets, and check Auto Normalize either way so the weights you shipped are the weights that render.

---

*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: blender unity godot rigging animation workflow

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 — plus OBJ and 3D-printable STL export.

Create a free account → Browse 846 models