../

Animating in Blender

Animation in Blender 5.x (5.2 LTS): the timeline, keyframes, the Dope Sheet, Graph Editor and NLA, actions and their slots (4.4+), armatures, weight painting, Rigify, shape keys, Mixamo, baking, and the glTF animation export modes. What keyframes, bones and skinning are is in Animation & rigging fundamentals; the destinations are Three.js, Godot and GTA V.

Timeline, frame rate & range

SettingWhereNotes
Frame rateOutput Properties › Format › Frame Ratedefault 24 fps; 30 or 60 for games and web. Changing it later does not move keys, so motion speeds up or slows down
Frame rangeTimeline header Start/End, or Output Properties › Frame Rangedefault 1–250; this is also the range Scene export mode bakes
Time StretchingOutput Properties › Frame Rangeremap an existing animation to a new length (Old → New frames)
Preview rangeP drag a box / Alt P clearsloop a short segment while working; does not affect rendering
Loop mode (5.2)Playback popover › LoopInfinite (default), Stop at End Frame, Stop at Start Frame, Restore Frame, Bounce

Since 5.0 every animation editor (Timeline, Dope Sheet, Graph Editor, NLA) has the same Playback Controls footer: play buttons, frame range, keying popover and auto-key.

KeyAction
Spaceplay / pause (the default Spacebar Action)
Shift Ctrl Spaceplay backward
Left / Right, Alt Wheelone frame back / forward
Up / Downprevious / next keyframe (swapped in 5.0: 4.x tutorials say Up = next)
Shift Left / Shift Rightjump to start / end
Ctrl Left / Ctrl Rightjump back / forward by a set delta (5.0+)
Shift RMB dragscrub from anywhere in an animation editor
Ctrl Ttoggle timecode (seconds) instead of frames

glTF, three.js and Godot store seconds, not frames: a key on frame 49 at 24 fps is at 2 s.

Keyframes & keying sets

A keyframe (key) stores a property's value at a frame; Blender interpolates between keys along an F-Curve (one curve per animated property channel, e.g. X location).

Do thisHow
Key the selectionI in the 3D Viewport (Object › Animation › Insert Keyframe): keys the channels set in Preferences › Animation › Default Key Channels (Location, Rotation, Scale and Custom Properties by default), or the active keying set if there is one
Pick what to keyK opens the keying set menu (Location, Rotation, Scale, Location Rotation & Scale, Available, Visual…)
Key one propertyhover any field and press I, or right-click › Insert Keyframe
Pie of channelsenable "Pie Menu on Drag" in Preferences › Keymap, then drag while holding I
Delete / clearAlt I deletes keys on this frame; Shift Alt I clears all keys
Auto keyingthe record button in the Playback Controls; keys transforms whenever you move, rotate or scale
Custom keying setScene Properties › Keying Set, add paths; Shift K sets the active one
Preference (Animation)Effect
Default Key Channelswhat I keys when no keying set is active
Only Insert Needed (Manual / Auto)skip keys that would not change the curve; off for manual keying, on for auto-keying by default
Visual Keyingkey the result of constraints, not the raw values
Only Insert Availableauto-key only channels that already have F-Curves. On by default since 5.2: press I once before auto-keying a new object
Default Interpolation, handlesfor new keys: Bézier with Auto Clamped handles

Key types (Right-click a key › Keyframe Type, or R in the Dope Sheet) only color-code keys: Keyframe, Breakdown, Moving Hold, Extreme, Jitter, Generated.

Dope Sheet & Graph Editor

The Dope Sheet shows keys as diamonds per channel (timing); the Graph Editor shows the F-Curves themselves (value over time, spacing). Its Action Editor mode edits one action at a time.

Key (both editors)Does
G / S / E (Dope Sheet)move / scale in time / extend keys around the playhead
TInterpolation Mode: Constant, Linear, Bézier, plus easing presets (Sine, Quad, Cubic, Back, Bounce, Elastic…)
Ctrl EEasing Type for the preset modes: Ease In, Ease Out, Ease In and Out
Vhandle type: Free, Aligned, Vector, Automatic, Auto Clamped
Shift Eextrapolation before the first / after the last key: Constant, Linear, Make Cyclic, Clear Cyclic
Shift Ctrl Madd an F-Curve modifier (Graph Editor; settings in Sidebar › Modifiers)
Shift D, Ctrl C / Ctrl Vduplicate, copy / paste keys
X (Graph Editor)delete, or Key › Density › Clean Keyframes to remove redundant keys
Alt O / Shift Alt Osmooth / bake keys to one per frame
Ctrl Mmirror keys (e.g. over the current frame)
Home, Numpad .frame all / selected
InterpolationLooks likeUse
Constantholds, then jumpsstepped blocking, visibility toggles
Linearconstant speedturntables, mechanical loops, conveyor belts
Bézier (default)eases in and out, shaped by handlesalmost everything organic
Back / Elastic / Bounceovershoot / wobble / bounceUI-style motion, drops
F-Curve modifierUse
Cyclesrepeat the keyed range forever (must be first in the stack); "Make Cyclic" adds it
Noisecamera shake, flicker
Steppedfake low frame rate (stop-motion look)
Limitsclamp values
Smooth (Gaussian) (5.1+)non-destructive smoothing (also first in the stack)

F-Curve modifiers do not export to glTF on their own: the exporter samples the evaluated curve over the action's range, so a Cycles modifier gives you one period, which you then loop in the engine.

Actions & slots

An action is the data-block that stores animation (its F-Curves); objects, materials and shape keys point at an action the way a mesh points at a material. Since 4.4 an action has slots: each slot holds the channels for one animated data-block, so one "DoorOpen" action can drive the door object (slot OBDoor) and its handle (slot OBHandle) together.

Door object Handle object Action “DoorOpen” slot OBDoor: rotation Z slot OBHandle: rotation X 1 glTF clip “DoorOpen” NLA tracks on the Knight armature Walk Run Idle 3 glTF clips Walk Run Idle each data-block points at an action plus one slot (Blender 4.4+) track 1 track 2 track 3 Actions export mode: the active action and every pushed-down action become one clip each
Data-blocks point at an action and a slot; pushed-down actions become NLA strips, and each becomes a glTF clip
TermMeaning
Actionnamed, reusable clip (Walk, Run, Idle). A data-block: append, link, fake-user it
Slotthe part of an action meant for one data-block; name + type (object, material…) is unique inside the action
Active actionthe one a data-block is playing and the Dope Sheet edits; set in the Action Editor header or Properties › Animation panel
Channel groupfolder of channels, one per bone by default
Layers / stripsexist in the Python API since 4.4, not in the UI yet
OperationWhereDoes
New actionAction Editor header › Newstashes the previous active action automatically
Fake usershield icon next to the namekeeps an action with 0 users from being deleted on save
Push DownAction Editor › Action menu, or NLAmoves the active action to a new NLA track (a strip)
StashAction Editor › Actionlike Push Down but the track is muted
Merge AnimationAction Editor › Actionmerges the selected objects' animation into the active object's action, one slot each
Separate SlotsAction Editor › Actionsplits every slot into its own action
Replace Action (5.1+)Object/Pose › Animation, Action Editorswaps an action on every data-block using it
Manual Frame Range, Cyclic AnimationDope Sheet / NLA sidebar › Actionthe clip's intended range and loop intent; the glTF exporter uses this range for the clip

NLA editor & naming clips

The NLA (NonLinear Animation) editor stacks actions as strips on tracks, like layers. The orange top row is the active action; everything below is strips.

Key / menuDoes
Push Down (button on the action row)active action → new track below
Tab / Shift Tabtweak mode: edit the strip's action (Shift Tab isolates it)
Shift Aadd an action strip to the active track
Shift Ttransition strip between two selected strips
Star icon (Solo)play only this track
Hmute strips
Ysplit a strip at the playhead
Shift D / Alt Dlinked duplicate (same action) / real copy
Strip sidebar (N)Repeat, Scale, Blend In/Out, Extrapolation, Blending (Replace, Add, Multiply)

For export, each action you want as a clip must be the active action or pushed down / stashed on an object. Exception: with one armature in the export, Export all Armature Actions (on by default) also exports every other action that fits it, stashed or not; delete or rename test actions first. The glTF clip name is the action name; with Merge Animation set to NLA Track Names (or the NLA Tracks mode) it is the track name instead. Name them for the engine:

TargetNaming
three.jsAnimationClip.name = the name; AnimationClip.findByName(gltf.animations, "Walk")
Godotend or start the name with loop or cycle (Walk-loop, Run_cycle) to import it looping; a -loop or _cycle ending is stripped (Walk); see Godot export
GTA Vclips go through Sollumz, not glTF; see GTA V export

Prefix actions per character (Knight_Walk) when several rigs share a file: every action is visible everywhere.

Armatures, weights & IK

An armature is a skeleton object made of bones; the mesh follows the bones through vertex groups (one per bone, weights 0–1) and an Armature modifier. Model the character in a T-pose or A-pose, facing −Y, with applied scale (Ctrl A › All Transforms) before rigging.

StepModeHow
Add an armatureObjectShift A › Armature (one bone at the 3D cursor)
Add a boneEditShift A (redo panel: Space, Align, Length, Deform in 5.2)
Extrude a child boneEditE from a tip; Shift E extrudes a mirrored .L / .R pair (Extrude Forked)
Add by clickingEditCtrl RMB where the new tip should go
Name for mirroringEditUpperArm.L / UpperArm.R; Armature › Names › AutoName Left/Right, Symmetrize
Bone rollEditShift N Recalculate Roll (e.g. Global +Z), Ctrl R set roll, Alt R clear
Parent a boneEditselect child, then parent, Ctrl P › Keep Offset / Connected
See bones through the meshObject Data › Viewport DisplayIn Front
Skin the meshObjectselect mesh, Shift-select armature, Ctrl P › With Automatic Weights
PosePoseCtrl Tab on the armature; G / R / S bones; Alt G / Alt R / Alt S clear
Apply rest posePoseCtrl A › Apply Pose as Rest Pose
IKPoseselect the target bone, then the chain tip; Shift I › Target Selected Bone; set Chain Length
Remove IKPoseCtrl Alt I

Bone roll is the twist around the bone's own axis; inconsistent roll makes mirrored poses and retargeting go wrong. IK (inverse kinematics) rotates a chain so its tip reaches a target (feet on the ground, hands on a rail); a Pole Target aims the knee or elbow. IK always evaluates after other constraints on those bones.

Weight painting fixes what automatic weights get wrong (armpits, hips, clothing):

  1. Armature in Pose Mode, then select the mesh and switch to Weight Paint (Ctrl Tab pie). Uncheck Edit › Lock Object Modes if it blocks you.
  2. Alt LMB (or Shift Ctrl LMB) a bone to show its group; paint with LMB. Red = 1, blue = 0.
  3. Brushes: Paint (blend modes Mix, Add, Subtract…), Blur, Average, Smear, plus the Gradient tool; X mirror in the header.
  4. Weights menu: Normalize All (every vertex sums to 1), Limit Total to 4 influences (the common engine limit; glTF exports 4 by default), Clean (drop tiny weights), Mirror Vertex Group.
  5. Test with extreme poses; keyframe a few test poses on frames you delete later.

Ryan King Art's beginner rigging tutorial: watch for bone placement, automatic weights, and fixing weights at the joints.

Character Rigging for Beginners (Blender Tutorial) (opens in a new tab) (Ryan King Art, YouTube)

Rigify & game skeletons

Rigify generates a full animation rig (IK/FK arms and legs, spine, fingers, face) from a simple meta-rig. It ships with Blender; enable it in Preferences › Add-ons › Rigify.

  1. Object Mode: Shift A › Armature › Human (or Basic Human, Basic Quadruped, Bird, Cat, Horse, Shark, Wolf).
  2. Match the character: scale the meta-rig in Pose Mode and Apply Pose as Rest Pose, or move bones in Edit Mode. Keep knees and elbows slightly bent so the IK direction is known; delete the face bones (Face bone collection) if you animate the face with shape keys. Rigify assumes 1 unit = 1 m.
  3. Armature Properties › Rigify › Generate Rig. Regenerate after editing the meta-rig; it overwrites the rig in place.
  4. Parent the mesh to the generated rig with Automatic Weights.
Rigify bone prefixRoleEngine needs it?
DEF-deforms the mesh (Deform checked)yes: the only bones the engine should see
ORG-copies of the meta-rig bonesno
MCH-mechanism (helper math)no
no prefixanimator controls (circles, IK handles)no

Game engines want a small, clean hierarchy of deform bones: every extra bone costs skinning time and file size, and control bones mean nothing outside Blender. Export with glTF Data › Armature › Export Deformation Bones Only (it bakes the controls' effect onto the deform bones). Rigify's DEF- chain is not one tidy parent hierarchy, so check the result in the engine; for strict skeletons (retargeting in Godot, Unity humanoid) build a separate game skeleton that follows the rig with Copy Transforms constraints and bake it (see Baking).

Shape keys

Shape keys (morph targets, blend shapes) store alternate vertex positions of the same mesh: smiles, blinks, phonemes, corrective shapes. Object Data Properties › Shape Keys:

StepHow
Create the Basis+ once: the rest shape
Add a shape+ again, then edit that key in Edit Mode (the others stay untouched)
PreviewValue slider 0–1 (Range Min/Max can extend it)
Animatehover Value, press I; or drive it from a bone (right-click › Add Driver)
MirrorShape Key Specials › Mirror Shape Key, or the 5.0 "Flipped" variants of Join as Shapes
New from the current mixShape Key Specials › New Shape from Mix
Make a key the new basisMake Basis (5.0), or Apply to Basis (5.1)
Export factDetail
glTFshape keys → morph targets; their Value animation → morph weight tracks (Data › Shape Keys, Animation › Shape Keys Animations)
Apply Modifiersthe glTF option cannot export shape keys; apply modifiers yourself or keep the stack shape-key-safe (Armature is excluded anyway)
Driven by bonesexported only when sampled and the mesh is a direct child of the armature
three.jsmesh.morphTargetDictionary["Smile"], see Models & animation
Budgeteach key stores a full copy of changed vertex data; keep counts low for web

Mixamo characters

Mixamo (opens in a new tab) (free with an Adobe ID; not actively supported) auto-rigs a humanoid and has a large motion library.

  1. Export your mesh as FBX (or OBJ) from Blender: one mesh, T-pose, applied transforms, facing −Y.
  2. Upload, place the chin / wrists / elbows / knees / groin markers, and let it rig.
  3. Pick animations; tick In Place for locomotion you'll drive from code. Download FBX Binary, the first clip With Skin, the rest Without Skin, at your project frame rate.
  4. Blender: File › Import › FBX (5.x has a new native importer; each FBX "take" becomes an action).
ProblemFix
Armature imports at 0.01 scale and 90° X rotationleave it until every clip is imported; applying scale early breaks the Hips location curves. The glTF export carries the object transform correctly
Need scale 1 / a root bone for gamesthe Import Mixamo – Root Motion (opens in a new tab) extension batch-applies transforms and adds a root bone
Want to edit Mixamo motionMixamo Rig (opens in a new tab) extension (GPL, Blender 4.2+): one-click IK control rig, bake to and from the skeleton
Bones called mixamorig:Hipsthree.js strips : from track names; rename (see the bpy sheet) or keep names consistent across all clips
Each clip arrives as its own armaturekeep one armature, assign each imported action to it (Action Editor), push down, delete the extra armatures

Object animation for websites

Most web "3D motion" is a few transforms on a loop: a spinning product, a floating logo, a door that opens on scroll. Keep it small and seamless.

EffectKeysSettings
TurntableRotation Z: 0° at frame 1, 360° at frame 121Linear interpolation, Make Cyclic; export the full 1–121 range (engines loop by time, so 360° wraps cleanly to 0°); render video frames 1–120
Hover bobLocation Z: 0 at 1, 0.1 at 31, 0 at 61Bézier (ease in/out), Make Cyclic
PulseScale: 1 → 1.05 → 1Sine interpolation, Ease In and Out
Door / drawerRotation or Location, two keysBézier; one action per state (Door_Open) so code can play it
Camera fly-throughFollow Path or keyed camera; Scene mode exportsample every frame; keep it under ~10 s

When the motion is this simple, animating in code (a rotation.y += dt or a tween) is smaller than a clip; export clips for motion that's hard to write by hand or for rigged characters. Playback on the web side is in Three.js models & animation and Web export.

Baking constraints, IK & physics

Engines understand keyed transforms of objects and bones and shape key weights. Constraints, IK, drivers, F-Curve modifiers and simulations must be baked to plain keys.

SourceBake withNotes
Constraints, IK, drivers on bonesPose › Animation › Bake Actiontick Visual Keying; Clear Constraints to drop the rig logic; Only Selected Bones; Bake Data: Pose
Constraints on objectsObject › Animation › Bake ActionBake Data: Object; Clear Parents if it follows another object
NLA stack (layers, transitions)NLA › Strip › Bake Actionproduces one action per object
Rigid bodyObject › Rigid Body › Bake To Keyframesone key per frame per object; then Clean Keyframes
Cloth, soft body, fluidsPhysics tab › Cache › Bake; File › Export › Alembic (.abc) for other DCC toolsglTF has no per-vertex animation except shape keys: for the web, use a few shape keys or a vertex animation texture
Geometry Nodes simulationnode Bake, then Alembic or realize per framesame limits as cloth

Bake Action options: Start / End / Frame Step, Only Selected Bones, Visual Keying (key the final transform with constraints applied), Clear Constraints, Clear Parents, Overwrite Current Action (off creates a new action), Clean Curves, Bake Data (Pose / Object), Channels (Location, Rotation, Scale, B-Bone, Custom Properties). The glTF exporter samples animation by default and has Bake All Objects Animations for constrained objects, but an explicit bake is what you can inspect and fix.

glTF animation export

File › Export › glTF 2.0 › Animation panel. Only object transforms, pose bones and shape key values are exported in the core format; material, light and camera property animation needs the experimental Animation Pointer option (NLA Tracks or Scene mode only).

Animation modeExportsPick it for
Actions (default)every action that is active or on an NLA track (pushed down / stashed) as its own clip; since 4.4 grouped by action, so all slots of one action play togethercharacters with a clip library: three.js and Godot
Active actions mergedthe currently assigned actions of all objects as one clipa single scene-wide animation (intro, product reveal)
Broadcast actionsevery compatible action onto every object it fitsshared clips across several rigs
NLA Trackseach NLA track as a clip, with strip timing, blending and modifierswhen you composed clips from several strips
Scenewhat you see in the viewport over the scene range, bakedcutscenes, camera fly-throughs, physics bakes
OptionRecommendation
Animation › Merge Animationby Action (default: clips named after actions); NLA Track Names to name clips after tracks and group same-named tracks across objects
Rest & Ranges › Set all glTF Animation starting at 0on for loops
Rest & Ranges › Limit to Playback Rangeclips every clip to the scene range; off for loops whose closing key sits past the scene end
Armature › Export all Armature Actionson by default: with a single armature, every action that fits it becomes a clip
Armature › Reset pose bones between actionson (default), so un-keyed bones don't inherit the previous clip
Data › Armature › Export Deformation Bones Onlyon for Rigify and other control rigs
Sampling › Sampling Rate1 (every frame); raise to shrink files
Optimize Animation Sizeon (default): drops duplicate keys
Data › Skinning › Bone influences4 (default); 8 only if the engine supports it

three.js: each clip is an AnimationClip in gltf.animations. Godot: each becomes an Animation in the imported AnimationPlayer, looping if the name has loop / cycle. Checklists live in Web export and Godot export.

Recipes

Loop a walk cycle for Godot

Use for any looping locomotion clip.

  1. Key the contact pose on frame 1 and copy it (Ctrl C / Ctrl V in the Dope Sheet) to frame 25; key the passing and opposite contact poses in between (13 is the mirrored contact: Pose › Paste Pose Flipped).
  2. Graph Editor: select all, Shift E › Make Cyclic; smooth the seam with handles, not extra keys.
  3. Action Editor: name the action Walk-loop; in the sidebar set Manual Frame Range 1–25 and Cyclic Animation. The range includes the closing key, and the exporter uses it as the clip length (1 s at 24 fps), so the engine wraps from frame 25 to the identical frame 1 without a hitch.
  4. Push Down. Export glTF, Animation mode Actions, "Set all glTF Animation starting at 0" on.
  5. In Godot the clip imports as Walk (suffix stripped) with looping on; enable root motion or move the body in code.

Export several actions as clips

Use for a character with Idle / Walk / Run / Jump for three.js or Godot.

  1. Create each clip with Action Editor › New, name it, animate, then Push Down (or Stash).
  2. Check the NLA: one track per action on the armature; mute nothing you want exported.
  3. Export: Animation mode Actions, Export all Armature Actions on, Reset pose bones on, Deformation Bones Only if you used Rigify.
  4. Verify in glTF Viewer (opens in a new tab) that the clip list matches.

The same stashing from Python (5.x API, slots set explicitly). Exported with Merge Animation › NLA Track Names, the clips are Walk, Run…; with the default they keep the action names:

import bpy
 
arm = bpy.data.objects["Knight"]
ad = arm.animation_data or arm.animation_data_create()
for act in bpy.data.actions:
    if not act.name.startswith("Knight_"):
        continue
    track = ad.nla_tracks.new()
    track.name = act.name.removeprefix("Knight_")
    strip = track.strips.new(act.name, 1, act)
    if act.slots:
        strip.action_slot = act.slots[0]
ad.action = None  # nothing active; all clips on tracks

Turntable for a product page

Use for a 360° product spin that loops forever.

  1. Parent the product to an Empty at the origin; animate the Empty's Rotation Z.
  2. Frame 1: key Z = 0°. Frame 121: key Z = 360°. Select both keys, T › Linear, Shift E › Make Cyclic.
  3. For a rendered video, set the scene range 1–120 (frame 121 would repeat frame 1). For glTF, keep the action's full 1–121 range and leave Limit to Playback Range off: the clip lasts exactly 5 s at 24 fps.
  4. Export with Animation mode Actions and "starting at 0"; in three.js play it with LoopRepeat.

Fix a Mixamo character for the web

Use when a Mixamo FBX looks right in Blender but wrong in the browser.

  1. Import all FBX clips; merge their actions onto one armature and push each down with a clean name.
  2. Rename bones to drop mixamorig:. Blender renames the matching channels in the actions the armature uses (active and on its NLA tracks), so push every clip down first, then play each one to check.
  3. Remove the extra armatures and meshes; apply transforms last, or leave the 0.01 scale and let glTF carry it.
  4. Export: Actions mode, Deformation Bones Only off (Mixamo bones already all deform), Limit Total weights 4.

Bake an IK rig for export

Use when feet slide or hands float in the engine but look right in Blender.

  1. Select the armature, Pose Mode, select all bones (A).
  2. Pose › Animation › Bake Action: frames of the clip, Visual Keying on, Clear Constraints on, Overwrite Current Action off, Bake Data Pose.
  3. Rename the baked action (Knight_Climb), push it down, and export only the baked actions.
  4. Keep the original rigged action (fake user) for further edits.

Face animation with shape keys

Use for blinking, lip sync or expressions on a web or Godot character.

  1. Model Basis, then keys Blink, Smile, A, O, M (edit each in Edit Mode with the key selected).
  2. Key the Values in an action (or drive them from a jaw bone).
  3. Don't enable "Apply Modifiers" on export (it drops shape keys); apply Mirror or Subdivision before making the keys.
  4. three.js: set morphTargetInfluences[dict["Blink"]]; Godot: mesh.set_blend_shape_value().

References