Rigging an image-to-3D ogre: what failed first, in order
Created by Matt · Developer of Isentroth · 1 November 2026
Written with AI help, per the author.
Note. Isentroth is a pre-release game. Arcanum has written a first look at it and has not rated it. This entry was accepted under the same rules as every other entry and has no effect on any review, score or rank.
We turned a reference image of a character into an animated model: FLUX for an A-pose reference, TRELLIS.2 for a vertex-coloured mesh, then our own binder to fit the CC0 KayKit Knight skeleton and its animation clips to the mesh. The Knight ships with 76 clips; our binder adds 12 death clips we authored, 88 in all. The model is an ogre-like body with huge arms, short legs and a head sunk between the shoulders. Every rig below looked plausible in a still. This note is what failed, in the order it failed, what we measured, and the checks we built so the same mistakes fail a script instead of a person.
What failed, in order
1. Stiff walk, stub off-arm, stretching weapon arm
- Measured
- The arm chain was 0.35 m long on a 0.55 m arm. The shoulder pivot sat at the outer edge of the deltoid and the elbow sat in the bicep, so the deltoid stayed on the chest and the arm bent mid-bicep.
- Cause
- The binder found the shoulder at the top of the arm's silhouette. On a fat body the upper arm merges with the torso in silhouette, so that "top" was really the armpit.
- Fix
- Fit the chain to the mesh's own arm: its centre line, the fist and the elbow bend.
- Check
arm.chain_coverage,arm.pivot_in_shoulder
2. A long neck after the arm fix
- Measured
- The neck base ended up 0.16 m above the shoulder pivots.
- Cause
- The torso joints were warped from the new shoulder height, and the neck search then landed on a row inside the skull.
- Fix
- Legs keep the original warp; only the spine, head and arms follow the mesh's shoulder line and neck base.
- Check
shoulder.neck_gap,neck.at_mesh_neck
3. The wrong skeleton shape
- Measured
- The KayKit armature has no clavicles and no neck bone; the arms hang straight off a chest joint at mid-sternum.
- Fix
- Insert a second spine joint, a neck, both clavicles and a head end. Each child's animation channels are rewritten relative to the inserted bone (child local = C-1 × old local), so the original joints move exactly as before: the worst error was 3.6e-9 of the figure's height across 9 clips.
- Check
- Topology rules taken from two standard humanoid references: at least three spine joints, clavicles off the top spine joint, a neck bone, a head that spans the skull.
4. Hip root below the thigh joints
- Measured
- The root sat 0.077 m below the thigh joints, an upside-down V.
- Fix
- Thigh joints at the femoral heads, root above them.
- Check
placement.hip_sockets,placement.hips_height
5. All 29 rules passed and it still looked wrong
- Measured
- A person reviewing the motion flagged the shoulder pivot, the upper-arm length, arms held out too wide (56° off vertical in idle), the deltoid and bicep deformation, and hips that sat too low.
- Fix
- Shoulder pivot from a sphere fitted to the deltoid cap; elbow moved (upper arm to forearm 1.28 → 1.21, a mistake: see the correction below); a 20° adduction offset on every upper-arm key, because 30° sank the arm 6.5 cm into the belly; weights smoothed around the pivot so clavicle to upper arm is a gradient; hips raised 0.096 m.
- Check
- Six new rules, each proven by a planted defect; the rejected rig now fails three of them.
- Correction
- The 1.21 was not aimed at the anthropometric ratio of about 1.27. That fit targeted an older 1.0 to 1.2 range, set before we adopted the anthropometric band, and it used a wrong template constant for the elbow-to-wrist share (0.58; the rig's real value is 0.50). The current rig is at 1.37, inside the 1.05 to 1.40 band.
6. Clavicles sloping after the pivot fit
- Measured
- Moving the pivot to the deltoid's centre put it 0.12 m below the neck base, so the clavicles sloped down about 23°.
- Decision
- Level clavicles win over the sphere's centre: the pivot moves up toward the top of the deltoid, inside the mass.
What we kept
A rig review script
rig_review.py reads a skinned glb directly (inverse bind matrices, weights, animations) with numpy and Pillow, skins sample frames by linear blend as the game does, and checks 35 rules from rig_schema.json with two body profiles, humanoid and ogre. It writes a sheet per rig: front and side bind overlays with neck-base, shoulder and hip guide lines, the rule table, and a pose strip. It exits 1 on any fail. Its self-test plants defects into a known-good rig (dropped shoulders, a head joint in the skull, a short arm chain, deltoid weights on the chest, a stub arm, misplaced hips) and requires each to turn its own rule red. That self-test is not part of the published files, because it loads rigs that cannot be shared.
| Group | What it checks |
|---|---|
| Symmetry | left/right joint pairs mirror |
| Shoulder line | shoulders level; gap to the neck base |
| Neck and spine | neck base at the mesh's neck; spine order; hips at the crotch |
| Arm chain | pivot inside the shoulder mass and near the deltoid sphere; elbow mid-chord; chain covers the arm; upper arm to forearm ratio |
| Leg chain | knee mid-leg; ankle height; feet on the floor; hip sockets and root height |
| Topology | spine joints, clavicles, neck bone, head span, chest at the rib base |
| Weights | each limb vertex owned by its nearest bone; no left/right or arm/leg mixing |
| Motion | edge stretch; arm swing in the walk; elbow clearance in idle; deltoid volume in raised, forward and lowered poses |
Run it on the stock Knight
The published example runs the script on the unmodified KayKit Knight (CC0, by Kay Lousberg). It needs Python 3 with numpy and Pillow; scipy is optional, and without it the deltoid-volume rule reports SKIP. It expects a skinned glb with a T-pose bind, KayKit bone names, Y up, +X as the figure's left, +Z forward and the feet at y = 0. Exit code 0 means every rule passed, 1 means at least one failed, 2 means the file could not be read.
python rig_review/rig_review.py knight/Knight.glb --profile humanoid --out-dir out --name kaykit_knight
Where the files are: the author publishes the script, schema and example at github.com/schedule3wizards/rig-review. Arcanum has not run or audited the code.

The stock Knight fails 5 of the 35 rules, all expected:
topology.clavicles,topology.neck_bone,topology.head_span: the armature has no clavicles, no neck bone and no head end joint.placement.chest_rib_base: the rule reports the joint nearer the rib base, here the spine joint at 0.27 of the hips-to-shoulder height. The chest joint is at 0.81. Neither sits in the allowed 0.40 to 0.68.arm.upper_fore_ratio: the upper arm is 0.93 times the forearm. Anthropometry puts it near 1.27 (Drillis and Contini via Winter), so the band is 1.05 to 1.40.
All 35 rules and the Knight's result
PASS: sym.joint_pairs, shoulder.level, shoulder.neck_gap, neck.at_mesh_neck, neck.skull_clear, spine.order, spine.hips_at_crotch, arm.pivot_in_shoulder, arm.pivot_height, arm.elbow_mid, arm.chain_coverage, arm.hand_at_mesh_hand, arm.on_axis, leg.knee_mid, leg.ankle_height, leg.feet_on_floor, joints.inside_mesh, topology.spine_segments, placement.hip_sockets, placement.knee_ankle_on_mesh, arm.pivot_glenohumeral, arm.upper_length_vs_mesh, motion.idle_arm_abduction, motion.deltoid_volume, placement.hips_height, weights.nearest_bone, weights.no_lr_mix, weights.no_arm_leg_mix, motion.edge_stretch, motion.arm_swing_walk.
FAIL: topology.clavicles, topology.neck_bone, topology.head_span, placement.chest_rib_base, arm.upper_fore_ratio.
Binder options
- A mesh-fitted arm chain.
- An anatomical skeleton mode (clavicles, neck, extra spine joint, head end) with exact animation retargeting.
- A per-rig arm adduction offset.
- A joint override exported from a Blender file, so a person can move bones by hand and re-bind exactly (round trip 7.7e-7 m).
With the options off, output is byte-identical to before (matching sha256), so existing figures are untouched.
A roster reading
Run over the 26 rigged figures already in our game, the script found that none has clavicles or a neck bone, 20 have too large a gap between the shoulders and the neck base, and 25 have an upper arm shorter than the forearm (ratio 0.93, inherited from the template, where anthropometry puts it near 1.27).
Limits
- A pass only means no measured rule fired. The script passed a rig a person rejected; six rules came from that review.
- Deformation quality is mostly unseen. It measures a convex-hull volume ratio around the deltoid, not whether a bicep looks right.
- Landmarks come from the mesh. Cloaks, robes, wings and tails corrupt them; three of our figures carry that flag.
- Elbow detection fails on this mesh. The narrowest arm section is the bracer's edge at the wrist, so one rule skips here.
- The arm-angle check became a clearance check. The clips' rotations act on the same T-pose bind, so the upper-arm angle reads 56.5° in idle on every rig and could not tell good from bad.
- One constant is tuned to the gate. The pivot's final medial nudge was set to satisfy the sphere rule, not derived from the mesh.
- No published joint-placement numbers exist for stylized bodies. Thresholds are anchored to the stock Knight, to anthropometry (Drillis and Contini via Winter: upper arm 0.186, forearm 0.146 of height), and to two reference images.
- Game skinning is linear blend. Blender's Preserve Volume keeps the deltoid fuller in a render, but the game rig has to read right without it.
Appendix: a joint-placement cheat sheet
Where we put each joint on a neutral humanoid. Placement rules are qualitative in every source we found; the only number is a clinical rule of thumb.
| Joint | Where it goes |
|---|---|
| Head | Base of the skull, near the bottom of the ear; the bone runs up to the crown. |
| Neck base | Top of the spine at the sternal notch, roughly level with the shoulder pivots. On a hunched body the neck is short and buried in the traps. |
| Clavicle | From the sternal notch out to the shoulder, near horizontal. Too far forward deforms badly. |
| Shoulder | Centre of the joint inside the deltoid, slightly high and out from the torso. Rule of thumb: about 5 cm below the outer tip of the shoulder bone on an adult; scale it to the figure. |
| Elbow | Centre of the joint, toward the back of the arm, with a slight bend so IK knows which way it folds. |
| Chest / spine | One bone for rigid areas, two for flexible ones; the chest joint sits at the base of the ribs. |
| Hips (root) | Top of the pelvis, level with or above the thigh joints, never below them. |
| Hip socket | The femoral head: top of the thigh at the groin crease, out to the side of the pelvis. |
| Knee | On a straight hip-to-ankle line in front view, nudged slightly forward in side view. |
| Ankle | Just above the bony lump of the outer ankle. |
Rest pose. Bind the skin in the pose the mesh was made in. Practitioners prefer an A-pose for skinning because the shoulders sit near neutral; a T-pose is easier for mirroring and motion capture.
Where this came from. Maya Rigging Wiki (joint placement), the Blender manual (Rigify bone positioning), Godot's retargeting documentation, and the Clinical Gait Analysis FAQ for the shoulder rule of thumb. Several are community pages, and they are not linked here.
Submitted to the Arcanum Community Library by Matt and published here with the author's permission. The note is shared under CC BY 4.0: share and adapt it freely, crediting "Matt, Isentroth". The rig review script and schema are MIT licensed, copyright (c) 2026 Mattlock of Schedule 3 Wizards, and the KayKit Knight is CC0 (Kay Lousberg). Arcanum has not tested or audited these claims.