Loading...
Loading...
Use when rigging a character, creature or prop in Blender through Python: "rig this character", Rigify metarig fitting or generation errors, automatic weights or "Bone Heat Weighting failed", weight painting fixes, clothes that do not follow, IK/FK switch, foot roll, twist bones, drivers and custom properties, corrective shape keys, a stylized face rig, a mechanical or hard-surface rig, or testing how a rig deforms.
npx skill4agent add scenario-labs/skills scenario-blender-riggingnpx skills add scenario-labs/skills --skill <name>scripts/bx_rig.pyimport sys; sys.path.append("<skills>/scenario-blender-rigging/scripts"); import bx_rig as Rparent_set| Input | Changes | Default when silent |
|---|---|---|
| Target: Blender render vs game/FBX | segmented DEF bones, max 4 influences, no Preserve Volume / Corrective Smooth / B-bone deformation | Blender-only keyframe animation |
| Character: biped, quadruped, mechanical, prop | metarig preset or custom samples; rigid islands | biped, Rigify |
| Face need and style | none / Rigify face / bones + shape keys + on-face controls | body rig + eye and jaw bones only |
| Fingers | Rigify Human (fingers + face) vs Basic Human | Basic Human (CGDive: first rig) |
| Pose, pieces, scale | T or A pose, separate eyes/teeth/clothes, real scale | measure; fix in the model check |
| Animator conventions | FK/IK defaults, side colors, finger controls | legs IK, arms FK, follow 0; left blue, right red (ask) |
| Rigify | Manual / scripted rig |
|---|---|
| Humans and animals with standard anatomy, many characters sharing controls, fast production-grade result | Unusual anatomy, mechanical parts, strict game-engine hierarchies, rigs that must stay small, or when the brief asks for a custom control scheme |
| |
| Metarig types: arm exactly 3 bones, leg 4 + heel, spine 3+, super_copy 1 bone | DEF / MCH / CTRL: only DEF deforms, MCH is never animated, everything else is a control |
R.model_check([body, *parts], fix=True)model_check(...)["problems"] == []lm = R.landmarks(body, eyes=eyes)overrides={...}lm["notes"]meta = R.add_metarig("basic"|"human")R.fit_metarig(meta, lm)new_boneR.check_metarig(meta, body) == []R.placement_sheet([body, eyes], out, arm_obj=meta, views=("front","right","top"))center=size=R.upgrade_face(meta)rig, err = R.generate(meta)errmirror_driversmake_def_layerorganizestatic_cycles == []cycle_check() == []root_test < 1e-4rep = R.bind(rig, body, garments=[shirt, pants], rigid={eyes: None, teeth: "DEF-teeth.T"})rep["ok"]unweighted == 0max_influences=4dr = R.deformation_report(rig, [body, *garments], R.RIGIFY_POSES)R.flag_report(dr)R.pose_sheet(...)R.joint_sheet(...)strip_opposite_sideassign_rigidsmooth_weightsclean_weightsvolume_restore_targetscorrective_from_targetscorrective_driverpreserve_volume_maskrig_ui.py| Value | Relative to | Source |
|---|---|---|
| Knee/elbow pre-bend 1 to 3 deg (fit: 1.2% of limb length, 2.7 deg); check 1 to 15 | chain in the bend view | CGDive; check [added] |
| 4 twist bones, Copy Rotation 1.0 / 0.66 / 0.33 / 0.1 (thigh 0.05) | from the driving end | CGDive |
| IK chain length 2; IK Stretch 0.1; lock IK Y/Z on shin and forearm | IK bone | Wayne, CGDive |
| Foot roll: heel X [-90, 0], toe X [0, 90], inside/outside Z one-sided | pivot local, roll 0, pointing up | CGDive (verified) |
| Weight brush Add, strength 0.1 to 0.2, Auto Normalize; seams Mix 0.5 at strength 1 | Weight Paint | CGDive |
Clean near-zero weights before blurring (Demeter); limit 0.001 (CGDive), 0.01 in | per vertex | Demeter, CGDive |
| Eyelid follow 0.15 (bone face); Rigify eyelid follow Z 0.3 (default 0.7); jaw bottom lip 0.9; mouth corners follow jaw 0.5 | face | CGDive |
| Palm 0.5 / 0.25; elbow plate 0.2 of forearm rotation | Copy Rotation Local, Mix Add | CGDive |
| Finger curl: Transformation Scale Z 0..1 to Rot Z 90..0 deg, Extrapolate | finger control | CGDive |
| Action constraint: keys frames 1 and 10, LINEAR, max = measured control travel | control local Y | CGDive, Demeter |
| Shoulder test range about 20 to 30 deg of clavicle raise | anatomy | CGDive |
| Face: about 16 Stop Staring shapes; 52 ARKit for mocap | shape keys | CGDive |
| Proxy voxel H/180, then H/90, H/45 | character height | [added, verified] |
| Collapse < 0.85, bulge > 1.25 (joint band), leak > 0.001 H, strain 0.5 to 1.6 | rest | [added] |
bx_rigcheck_metarigweight_reportdeformation_reportflag_reportstatic_cyclescycle_checkroot_testtwist_anglessolve_pole_anglerigid_checkRIGIFY_POSESreferences/critique.md| Mistake | What it looks like | Fix |
|---|---|---|
| Metarig scale or pose not applied | generated rig differs in size or pose | apply scale, Apply Pose as Rest Pose |
| Neck moved without the spine tip | "bone position is disjoint" | move joints as units ( |
| Straight knee or elbow | IK bends sideways or backward | pre-bend in the bend view |
| Parented to the metarig | mesh follows nothing useful | bind to the generated rig |
| Heat failure unnoticed | mesh does not move | |
| Armature below Subdivision, or before Mirror | slow; mirrored half copies the posed half | |
| Left thigh weights on the right leg | opposite side moves | |
| Eyes and teeth auto-weighted | drift, poke through | |
| Live Data Transfer on clothes | weights change while animating | apply it |
| Driver on an animatable bone | channel cannot be keyed | Transformation or Copy Rotation Mix Add |
| Inherit Rotation off for isolation | root rotation breaks the limb | follow bones (World Copy Loc/Rot/Scale) |
| IK target parented inside its chain | jitter, flips | clear parent; |
| Re-parenting a connected bone | head jumps to the new parent's tail | |
Symmetrize expected to copy drivers; | right side dead | |
| IK/FK left at 0.86 | mixed, unreadable deformation | exactly 0 or 1 |
enable_rigifyedit_bones.new()pose.bones[n].selectparent_setvertex_group_smooth_cleanbx_rigshape_key_addVertexGroup.removetailheadEditBone.transformtransform_bonesremap_driverkeyframe_insertuse_transform_at_custom_shapeuse_transform_around_custom_shapereferences/procedures.mdreferences/expert-notes.mdreferences/critique.mdreferences/sources.md