../

Animation & rigging concepts

How things move in 3D, in any tool: keyframes and interpolation, the kinds of animation, skeletons and skinning, IK and constraints, retargeting and mocap, root motion, clips and state machines, and what survives export to glTF. Builds on Core 3D concepts (transforms, quaternions). Doing it in Blender is Blender animation; playing it back is three.js models & animation and Godot UI, animation & audio.

Keyframes & frame rate

A keyframe stores one property's value at one moment ("X location = 2 m at frame 24"). The software fills in every frame between keys (interpolation, or "tweening"). A property's keys over time form an F-curve (function curve), one per channel (X, Y, Z…).

TermMeaning
Frame rate (fps)frames per second of the timeline: 24 film and Blender's default, 30 common for game clips, 60 for smooth UI
Timeline / Dope Sheetkeys as dots over time: edit timing
Graph Editorthe F-curves themselves: edit spacing (speed, easing)
Key pose / breakdown / in-betweenmain poses, the pose that shapes the transition, the frames the computer fills
Channelone animatable number: location.x, a bone's rotation W, a shape key's value
Action / clipa named set of F-curves ("Walk", "Idle") that can be reused and swapped

Engines don't play frames: glTF stores key times in seconds, and the engine samples the curve at whatever frame rate the game runs. A 24 fps clip still plays smoothly at 144 fps.

Interpolation, easing & F-curves

value ↑ · time → · ◆ = keyframe; the same three keys, three interpolation modes constant step: holds, then jumps glTF: STEP linear straight lines, sharp turns glTF: LINEAR Bézier eases in and out glTF: CUBICSPLINE / sampled
Same keys, three interpolation modes; glTF names in the last line.
ModeMotionBlenderglTFthree.js
Constantholds, then snapsConstantSTEPInterpolateDiscrete
Linearconstant speed, abrupt starts and stopsLinearLINEARInterpolateLinear
Bézier / cubiceases in and out; shaped by handlesBézier (default, Auto Clamped handles)CUBICSPLINE (Hermite tangents)InterpolateSmooth; GLTFLoader uses its own cubic-spline interpolant
  • Easing: ease-in starts slow, ease-out ends slow. Blender also has preset curves (Sine, Back, Bounce, Elastic) under Easing.
  • Handles set the slope at a key: flat handles make a hold, aligned handles a smooth pass-through, vector handles a sharp corner.
  • Rotation: quaternion keys interpolate on the shortest path (slerp); Euler keys can spin the long way or flip at ±180°.
  • F-curve modifiers (Blender): Cycles (loop a curve), Noise (camera shake), Stepped (animate "on twos"). They don't export; bake them to keys.
  • Exporters usually sample Bézier curves into dense linear keys, so the game plays the same motion without reading handles.

Kinds of animation

KindWhat movesGood forExports to glTF?
Transform (object)whole objects' position, rotation, scaledoors, platforms, props, camerasyes
Skeletalbones; the mesh follows through skinning weightscharacters, creatures, anything that bendsyes
Morph targets (shape keys, blend shapes)stored alternate vertex positions, blended by weightfaces, lip sync, corrective shapes, squashyes
Vertex animation texture (VAT)per-frame vertex positions baked into a texture, played in a shadercrowds, baked cloth, destruction, fluidsas textures + a custom shader
Physics simulationcloth, rigid bodies, fluids, hair, solved frame by framerealistic secondary motiononly after baking to keys, shape keys or VAT
Procedural / runtimecode: IK, look-at, springs, ragdollsfoot placement, aiming, reactionsno: done in the engine
Property animationmaterial values, light color, camera FOVblinking lights, fadesonly via KHR_animation_pointer (loader support varies)

Morph targets cost memory per shape (every vertex × every target), so keep them to faces and a few correctives. Blender shape keys become glTF morph targets; their animated values become weight tracks.

Armatures, bones & poses

A rig is everything that makes a model poseable: the skeleton, its controls, and the skin weights.

TermMeaning
Armature (Blender) / skeleton / skin (glTF)an object holding a hierarchy of bones
Bone / jointa transform in the hierarchy; Blender draws it with a head, tail and roll, engines see a joint (a node)
Root bonetop of the hierarchy, usually at the floor between the feet; carries root motion
Hierarchyroot → hips → spine → chest → neck → head; chest → shoulder → upper arm → forearm → hand…
Rest posethe bones' layout as built (Blender Edit Mode)
Bind posethe pose the mesh was attached in; glTF stores it as inverse bind matrices
T-pose / A-posearms straight out / angled down ~45°; A-pose deforms shoulders better, T-pose retargets easily
Deform bonesbones that move vertices; the only ones the game needs
Control boneshandles the animator grabs (IK targets, pole targets, foot roll); don't deform
Mechanism boneshelpers that drive other bones through constraints
Namingmirror-friendly names (hand.L / hand.R) let Blender mirror poses and weights

Auto-riggers: Blender's Rigify (bundled) generates control rigs from a metarig; Mixamo and several AI tools (see AI generation) rig humanoids automatically, deform bones only.

Skinning & weight painting

Skinning attaches a mesh to a skeleton: each vertex stores which bones affect it and by how much (weights). When a bone moves, each vertex moves by the weighted mix of its bones' motion. This is linear blend skinning, the method glTF, three.js and Godot use.

1 Armature 2 Weights 3 Pose upper arm forearm elbow joint upper 1 blend 0.5 / 0.5 forearm 1 each vertex: weights sum to 1 rotate the forearm bone elbow vertices blend both bones: a smooth bend Bones sit inside the mesh in the rest (bind) pose. Weight painting gives every vertex a weight per bone; posing moves each vertex by the weighted mix of its bones' motion.
Bones, weights, pose: the elbow bends smoothly because its vertices follow both bones.
ConceptRule
Weights per vertexnormalized: they sum to 1.0
Max influences4 bones per vertex is the safe number: glTF stores weights in sets of 4 and many engines read one set; Blender's exporter defaults to 4
Weight paintingpainting weights on the mesh; in Blender each bone has a vertex group of the same name
Automatic weightsthe tool guesses weights from bone distance (Blender "With Automatic Weights"); a good start, never the finish
Unweighted vertexstays behind in the rest pose while everything else moves
Bone countengines and phones prefer fewer: roughly 30–70 deform bones for a game humanoid, fingers included
ArtifactCauseFix
Elbow or knee collapses, loses volumelinear blending averages rotationsextra edge loops, corrective shape keys, helper bones
"Candy wrapper" twist at the wristall twist on one boneforearm twist bones sharing the rotation
Spiky or torn vertexa stray weight on a far boneweight-paint that area; limit total influences to 4 and normalize
Mesh shifts when rigged, before posingmesh or armature transforms not appliedapply scale / rotation on both, re-parent

Blender's Preserve Volume (dual-quaternion skinning) fixes volume loss in Blender only; it doesn't export, so fix deformation with topology and bones.

IK, FK & constraints

Forward kinematics (FK)Inverse kinematics (IK)
You seteach bone's rotation, parent to childwhere the end of the chain goes (hand, foot)
Solvernonecomputes the chain's rotations to reach the target
Good forarcs, swings, overlapping motion (arms swinging, tails)contact: planted feet, hands on a rail, reaching
Extra controlnonea pole target sets which way the knee or elbow points

Rigs usually offer an IK/FK switch per limb. Constraints tie a bone or object to something else: Copy Rotation, Track To / Damped Track (look at), Limit Rotation, Child Of (pick up and drop objects), Stretch To. Drivers set a property from other properties or an expression (a jaw bone driving a mouth shape key).

None of these travel through glTF or FBX: the exporter bakes their result into keys on the deform bones. Engines have their own runtime IK and look-at (three.js CCDIKSolver addon, Godot's SkeletonModifier3D family) for things that react to the game, like feet on uneven ground.

Retargeting & motion capture

Retargeting moves an animation from one skeleton to another with different bone names or proportions. It needs a bone map (which bone is which) and matching rest poses (T vs A-pose mismatches rotate arms).

ToolRetargeting
Blenderadd-ons and extensions (e.g. Rokoko's free plugin, Auto-Rig Pro's Remap, the Mixamo Rig extension)
Godot 4on import: a BoneMap to SkeletonProfileHumanoid renames bones and fixes rest poses, so clips share across characters
three.jsSkeletonUtils.retargetClip
Unity / UnrealHumanoid avatars / IK Retargeter

Mixamo (Adobe): upload a humanoid mesh, get it auto-rigged, and download from a large free library of mocap clips as FBX. Still free with an Adobe ID as of September 2026, but not actively supported.

Mixamo quirkHandling
FBX (or Collada .dae), often in centimetersfix scale on import (see units)
Bones prefixed mixamorig:rename or map in the retargeting tool
"In Place" checkbox on locomotiontick it for engine-driven movement (see below)
Download "Without Skin"for extra clips once you have the rigged character

Other mocap: video-based AI services turn phone footage into animation (quality varies; check current pricing and license), and suit or optical capture for studios. Mocap is dense (a key every frame): clean it in the Graph Editor, then reduce keys.

Root motion vs in-place

Root motionIn place
The clipmoves the root bone through space (a walk travels 1.4 m)stays on the spot; feet cycle under the hips
Who moves the characterthe animation drives the game objectgame code moves the character controller
Prosfeet never slide; exact distances for attacks, vaults, climbssimple, responsive, easy with physics
Consgameplay depends on the animation; harder to tune speedfeet slide if speed and clip don't match
Engine supportGodot AnimationTree root motion track; Unity / Unreal built in; three.js: read or strip the root track yourselfeverywhere

Common split: in-place locomotion (idle, walk, run) and root motion for one-off actions (dodge, climb).

Clips, blending & state machines

A character ships with a set of clips: idle, walk, run, jump (start / loop / land), attack, hit, die. The engine mixes them at runtime.

IdeaWhatthree.jsGodot
Clipone named animationAnimationClipAnimation in an AnimationLibrary
Playerplays clips on a modelAnimationMixer + AnimationActionAnimationPlayer
Cross-fadeblend from one clip to another over ~0.1–0.3 scrossFadeToAnimationTree transitions
Blend spacemix by a parameter (speed → idle / walk / run)manual weightsBlendSpace1D / BlendSpace2D
State machinestates and transitions (Idle → Run → Jump)your codeAnimationNodeStateMachine
Additive layeradd a clip on top (breathing, recoil)AdditiveAnimationBlendModeAdd nodes in a blend tree
Maskapply a clip to part of the body (upper-body attack while running)filter tracksblend tree filters
Synckeep foot phase when blending walk ↔ runsyncWithsync on blend nodes

In Blender each clip is an Action. Since 4.4 an Action has slots, so one action can animate several objects. The NLA (nonlinear animation) editor stacks and sequences actions, and the glTF exporter can export one glTF animation per action or per NLA track.

What survives export

Blender featureglTFWhat to do
Object location / rotation / scale keysyes: TRS tracksnothing
Bone keys on deform bonesyes (skins)export deform bones only
Skin weightsyes: up to 4 per setlimit to 4 and normalize before export
Shape keys and their animated valuesyes: morph targets + weight tracksnothing; watch memory
Bézier curves and handlessampled into linear keysnothing; set the sampling rate
Constraints, IK, drivers, control bonesnobake (the exporter samples the pose each frame; "Bake All Objects Animations" for constrained objects)
F-curve modifiers, NLA strip effectsnobake to keys
Physics (cloth, rigid body), geometry nodes animationnobake to keys, shape keys or VAT
Material, light and camera property animationonly via KHR_animation_pointercheck loader support, or animate in code
Dual-quaternion skinning (Preserve Volume)nofix with topology and bones
Multiple actionsyes: one glTF animation each (Actions mode) or per NLA trackname clips as the engine expects

For FBX (Unity, Unreal, Mixamo) the story is similar: keys, skins and blend shapes travel; constraints and drivers must be baked. GTA V uses its own formats via Sollumz; see GTA V.

Recipes

Before exporting an animated character

Run before every export of a rigged model.

  • Mesh and armature: scale 1.0, rotation applied, origin at the feet, facing −Y
  • Every vertex weighted; max 4 influences; weights normalized
  • Deform bones only in the export; control and mechanism bones excluded
  • IK, constraints and drivers baked (or the exporter set to sample them)
  • Each clip is its own Action with a clear name (Idle, Walk, Run)
  • Loops start and end on the same pose; in-place or root motion chosen per clip
  • Shape keys limited to the ones you use
  • Test in the target engine: play every clip, cross-fade two of them

Why does my mesh tear or collapse when posed?

Use when a pose looks wrong but the rig seems fine.

SymptomCauseFix
Part of the mesh stays behindvertices with no weightsweight-paint them; check vertex groups exist for each bone
Spikes to a distant bonestray small weightsclean weights (Blender: Clean, Limit Total 4, Normalize All)
Joint collapses or twists like a candy wrapperlinear blend skinningmore loops, twist bones, corrective shape keys
Fine in Blender, broken in enginemore than 4 influences, or Preserve Volume relied onlimit to 4; drop dual-quaternion reliance
Whole mesh offset or rotated once riggedunapplied transformsapply scale / rotation on mesh and armature, re-parent

Put a Mixamo animation on your own character

Use for fast placeholder or indie animation on a humanoid.

  1. Export the character (T or A-pose, facing forward, arms clear of the body) as FBX or OBJ; upload it.
  2. Place the auto-rig markers (chin, wrists, elbows, knees, groin); pick a skeleton LOD (fewer fingers = fewer bones).
  3. Download the rigged character once (FBX, With Skin), then each clip Without Skin; tick In Place for locomotion.
  4. Import into Blender; fix scale; rename or map mixamorig: bones if your engine or other clips need different names.
  5. Push each clip to its own action, check loops, and export glTF with the actions.

Loop a walk cycle cleanly

Use for any cycle: walk, run, idle, a spinning prop.

  1. Make the first and last key identical (copy the first key to the end).
  2. Set the loop range so the last frame isn't played twice (end at the frame before the duplicate, or trim in the engine).
  3. Use a Cycles F-curve modifier to preview the loop, then bake it before export.
  4. In place: keep the root still; root motion: the root moves a constant distance per cycle.
  5. In Godot, name the clip with a -loop suffix (Godot strips it and sets looping) or set Loop Mode on import; in three.js, LoopRepeat is the default.

Plan a game character's clip list

Use when starting a character, so animation and code agree.

GroupClips
Locomotion (in place)idle, walk, run, strafe left / right, turn in place
Airjump start, jump loop (falling), land
Actions (root motion if they travel)attack 1–3, dodge, interact, climb
Reactionshit front / back, die
Additivebreathing, aim offset, flinch

Same skeleton for every clip, same frame rate, consistent names; decide cross-fade times per transition.

References