npx skills add ...
npx skills add theorcdev/skills --skill rig-it
Rig and animate game characters that actually hold up in-engine. Contract-driven Blender pipeline with body-plan scaffold rigs for creatures, Mixamo-skeleton packaging for bipeds, rest-pose weight transfer, rigid part seating, numeric gates on a fresh reimport, rendered review frames and reels, Unity Humanoid/Generic export. Use when the user wants to rig a character, skin a mesh, build an armature, author or fix Idle/Locomotion/Attack/Hit/Death clips, package Meshy or Mixamo animations onto a production mesh, stop feet sliding or sinking, get a rig into Unity or Godot, or mentions rigging, skinning, weights, IK, gait, Mixamo, Meshy rig, Humanoid avatar, or invokes /rig-it.
npx skills add theorcdev/skills --skill rig-it
Rigging fails in chat because the model writes one script, gets an armature that binds, and never sees that the elbow is wrong. This skill never lets you judge a rig from the code that built it. Every rig and every clip goes through a contract, a family route, verified weights, numeric gates on a fresh reimport, and rendered frames you look at before anyone calls it done.
Read RULES.md before touching a mesh. Run WORKFLOW.md commands as written. Family bone lists live in references/body-plans.md.
rig-contract.json (schema in
templates/): family, engine rig type,
required clips, rigid parts with sockets, gameplay move speed. Tooling
reads it; tooling never redefines it.| Body | Route | Scripts |
|---|---|---|
| Biped that a Mixamo-template rigger accepts (Meshy, mixamo.com) | rig input, provider rig, preset motions, package onto the production mesh | rig_input.py, package_biped.py |
| Quadruped, hexapod, octopod, flyer, maw, winged hybrid, humanoid the provider mangles | deterministic scaffold rig from bounds, bind, author contact-driven clips | scaffold_rig.py, author_clips.py |
Root carries no skin weight and never
moves. Body motion lives on the body bone. Root motion is off in engine.export_fbx.py writes one FBX per
clip plus the production multi-take FBX. review_clips.py reimports each
clip into an empty scene, measures every frame on real vertices, renders
frames over a checker floor with the camera following travel, and runs
gates.py.package_biped.py polish passes fix those in
order. Gate thresholds change only with a recorded decision.reel.py cuts labeled 3 s sections. A passing
gate is screening, not art acceptance. The human signs off, the model
does not.Iterate as --version 2, 3. The pipeline refuses to overwrite a version;
earlier versions are the trail.
python3 scripts/contract.py rig-contract.json prints the required bones.inspect_model.py shows zero unweighted vertices, every required bone, every rigid part, +Z forward, feet on the ground plane.review_clips.py gates pass. Look at the frames from front and side, not only the review camera. Held parts hide behind bodies; legs pulled under hips read as glued.moveSpeed / nominalSpeed.# 0. environment
export RIG_IT_BLENDER=/Applications/Blender.app/Contents/MacOS/Blender # Blender 4.5 LTS
S=<path to this skill>/scripts
# 1. contract + inspect
cp $S/../templates/rig-contract.json wolf/rig-contract.json # edit family, clips, source, speed
$RIG_IT_BLENDER --background --factory-startup --python-exit-code 1 --python $S/inspect_model.py -- \
--input wolf/wolf.fbx --contract wolf/rig-contract.json --output wolf/inspect.json
# 2a. creature route: scaffold + bind, then author
$RIG_IT_BLENDER ... --python $S/scaffold_rig.py -- --contract wolf/rig-contract.json --input wolf/wolf.fbx \
--bind --output-blend wolf/wolf-rigged.blend --receipt wolf/rig-receipt.json
python3 $S/pipeline.py --contract wolf/rig-contract.json --version 1 --source wolf/wolf-rigged.blend --stage all --render keys
# 2b. biped route: body-only rig input -> provider rig + presets -> package
$RIG_IT_BLENDER ... --python $S/rig_input.py -- --contract mage/rig-contract.json --input mage/mage.fbx --output mage/rig-input/Mage_RigInput.glb
# (rig on Meshy or mixamo.com, download Mixamo-template FBXs with skin, one per motion)
python3 $S/pipeline.py --contract mage/rig-contract.json --version 1 --stage package --raw mage/raw \
--package-args "--map Idle_02=Idle --map Walking=Locomotion --map Spell=BasicAttack --map Hit=Hit --map Dead=Death \
--ground-clamp --plant-feet --lock-feet --loop-blend 6 --death-hold 0.6"
python3 $S/pipeline.py --contract mage/rig-contract.json --version 1 --stage export
python3 $S/pipeline.py --contract mage/rig-contract.json --version 1 --stage review --render all
python3 $S/pipeline.py --contract mage/rig-contract.json --version 1 --stage reel