v0.2 Now with quadruped and creature support

Character rigging
without the pain

Import any 3D model. Apply any animation. EasyRig handles skeleton generation, bone mapping, weight painting, and ragdoll physics automatically. Built for web game developers who have better things to do.

game.js
// load your model - skeleton generated automatically
const player = await EasyRig.load('player', '/character.glb')

// grab an animation from mixamo, blender, wherever
await player.applyAnimation('/run.glb')

// play it - bone mapping handled for you
player.play('run')

// enable ragdoll physics with one call
player.enableRagdoll(world).activateRagdoll()

Everything you need

Stop fighting with rigging software. EasyRig handles the technical complexity so you can focus on making your game.

Auto Skeleton Generation

Feed it a mesh with no rig - EasyRig analyzes the geometry and generates a proper skeleton. Humanoids, quadrupeds, creatures, custom shapes. T-pose recommended but not required.

Smart Weight Painting

Vertex weights calculated automatically using heat diffusion algorithms. No more painting weights by hand. Smooth deformations out of the box with configurable bone influence.

Animation Retargeting

Mixamo animation on a custom model? Different bone naming conventions? EasyRig figures out the mapping and applies animations correctly every time.

Ragdoll Physics

One function call to enable physics-based ragdoll. Works with Cannon.js, Ammo.js, and Rapier. Joint constraints preconfigured for realistic motion.

Inverse Kinematics

Built-in IK system for foot placement, look-at targets, and procedural animation. FABRIK solver with configurable chain length, iterations, and constraints.

Runtime Ready

All processing happens at runtime. No export pipeline, no preprocessing, no build steps. Load a model, get a rigged character. Works with Three.js out of the box.

Four steps to animated characters

From static mesh to fully animated character with physics. No rigging experience required.

1

Load Your Model

Any GLB or GLTF file. Rigged or unrigged, EasyRig handles both.

2

Auto Skeleton

Geometry analyzed, skeleton generated, weights calculated automatically.

3

Apply Animations

Load animations from any source. Bone names mapped automatically.

4

Add Physics

Enable ragdoll with one call. Joint limits preconfigured.

The traditional way vs EasyRig

What usually takes hours of technical work now takes minutes of writing code.

Traditional Workflow

  • Import model into Blender or Maya
  • Manually create armature and position bones
  • Paint vertex weights for each bone
  • Download animation, retarget bones manually
  • Export, test, fix issues, repeat
  • Implement ragdoll physics from scratch

With EasyRig

  • Load model directly in your game
  • Skeleton generated from geometry analysis
  • Weights calculated with heat diffusion
  • Apply any animation, mapping handled
  • Works immediately, iterate in code
  • Ragdoll enabled with one function call

See it in action

A complete character setup in under 20 lines of code.

Full character setup

This example loads a character model, applies walk and run animations, sets up ragdoll physics, and handles animation blending. Everything you need for a game-ready character.

  • Works with any humanoid mesh
  • Animations from Mixamo or custom
  • Smooth crossfading built in
  • Physics ragdoll on demand
character.js
import * as CANNON from 'cannon-es'

// initialize
EasyRig.init({ debug: true })

// load character
const player = await EasyRig.load('hero', '/models/character.glb')

// apply animations
await player.applyAnimation('/anims/idle.glb', 'idle')
await player.applyAnimation('/anims/walk.glb', 'walk')
await player.applyAnimation('/anims/run.glb', 'run')

// setup physics
const world = new CANNON.World()
player.enableRagdoll(world)

// play animation
player.play('idle')

// on damage
function onHit(impact) {
  player.activateRagdoll(impact.velocity)
}

// update loop
function update(dt) {
  player.update(dt)
}

Ready to stop rigging manually?

Add EasyRig to your project and start animating characters in minutes, not hours.

<script src="https://easy-rig.vercel.app/api/easyrig"></script>