A dog that looks right and moves right
Assume the artist’s skeleton is good. Fit tubes, ovals and flat sheets to four pictures, blend them into one skin, then use Blender’s automatic weights to check motion. Compare against a ball at each deform joint.
Shape pass: four-view mean IoU ≥ 0.90, worst ≥ 0.85; held-back three-quarter IoU ≥ 0.85; surface p90 ≤ 3% of length (2.01 cm). Motion pass in every bend: p90 growth ≤ 1.5 × rest p90, volume change ≤ 10%, and intersecting face pairs ≤ truth + 1% of our triangles.
Blender remeshed models; all scores below computed.
Reading this first (director): the motion part works: bending each joint 30 degrees changes our model's distance to the real model by at most 0.24 cm and its volume by at most 3%. The motion verdict says "fail" only because our mesh already has about 186 small self-crossing faces standing still, left by the remesh step (not by the motion); that is a mesh-cleanup fault to fix. The shape part is where the dog fails: the body is lumpy (too many ovals), the muzzle is missing, the ears are flat discs lying the wrong way, and small sheets stick out at the feet. The balls-only comparison is broken (its balls did not touch, so only the head cluster survived), so ignore that column.
Moving: the real model and ours, side by side
In every clip the real model with the artist's own rig is on the left, and our model on the same skeleton, rigged automatically by Blender, is on the right. Both get exactly the same motion and the same camera.
Our model's shape is still wrong (lumpy body, no muzzle, odd ears), so ignore that here and watch only how the parts move. What to look at:
- The part that should move moves, and nothing else is dragged along with it (bending a leg should not pull the belly).
- At the joint, the surface bends smoothly, without pinching thin, tearing or bulging.
- The moving part keeps its thickness.
What I see (director):
- The legs and the neck follow the real model well.
- Bending the middle of the back leaves visible folds on our back where the real one bends cleanly.
- Our model has no tail: the dog's tail is a short stub, our shape step missed it, so on the right nothing moves in the tail clip. That is a shape fault, not a motion fault.








Three-quarter · rest



Shapes: front 0.791, side 0.776, back 0.791, top 0.837; mean 0.799, worst 0.776; held-back 0.770; surface mean / p90 1.56 / 4.12 cm. mean iou FAIL · worst iou FAIL · three quarter FAIL · surface FAIL
Balls: front 0.570, side 0.293, back 0.571, top 0.291; mean 0.431, worst 0.291; held-back 0.313; surface mean / p90 8.05 / 34.23 cm. mean iou FAIL · worst iou FAIL · three quarter FAIL · surface FAIL
Side · rest



Shapes: front 0.791, side 0.776, back 0.791, top 0.837; mean 0.799, worst 0.776; held-back 0.770; surface mean / p90 1.56 / 4.12 cm. mean iou FAIL · worst iou FAIL · three quarter FAIL · surface FAIL
Balls: front 0.570, side 0.293, back 0.571, top 0.291; mean 0.431, worst 0.291; held-back 0.313; surface mean / p90 8.05 / 34.23 cm. mean iou FAIL · worst iou FAIL · three quarter FAIL · surface FAIL
ours: 5994 vertices, 12000 triangles; watertight True; nonmanifold edges 0; method voxel+decimate.
balls: 6002 vertices, 12000 triangles; watertight True; nonmanifold edges 0; method voxel+decimate.
Skeleton and attached shapes



{'oval': 22, 'tube': 13, 'sheet': 4}; bone kinds {'both': 39, 'motion-only': 2}; 4 shape-only points. Colors are shape types, not anatomy labels.
Each bone’s choice and rule
sheet if smaller transverse half-width < 0.3 * larger; otherwise oval if transverse diameter (geometric mean) > 1.5 * bone length; otherwise tube
| Bone / owner | Kind | Shape |
|---|---|---|
| dog-3-20-2009LLeg1 | both | oval |
| dog-3-20-2009LLeg2 | both | oval |
| dog-3-20-2009LLegPalm | both | tube |
| dog-3-20-2009LLegDigit32 | both | sheet |
| dog-3-20-2009Spine1_032 | both | oval |
| dog-3-20-2009Spine2_033 | both | oval |
| dog-3-20-2009Spine3_034 | both | oval |
| dog-3-20-2009Ribcage_031 | both | tube |
| dog-3-20-2009LLegCollarbone_03 | both | oval |
| dog-3-20-2009LLeg1_01 | both | oval |
| dog-3-20-2009LLeg2_02 | both | oval |
| dog-3-20-2009LLegPalm_012 | both | tube |
| dog-3-20-2009LLegDigit12_07 | both | tube |
| dog-3-20-2009LLegDigit22_09 | both | tube |
| dog-3-20-2009LLegDigit32_011 | both | tube |
| dog-3-20-2009RLegCollarbone_021 | both | oval |
| dog-3-20-2009RLeg1 | both | oval |
| dog-3-20-2009RLeg2 | both | oval |
| dog-3-20-2009RLegPalm | both | tube |
| dog-3-20-2009RLegDigit01_022 | both | tube |
| dog-3-20-2009RLegDigit02 | both | sheet |
| dog-3-20-2009RLegDigit11 | both | tube |
| dog-3-20-2009RLegDigit12 | both | oval |
| dog-3-20-2009RLegDigit21 | both | tube |
| dog-3-20-2009RLegDigit22 | both | oval |
| dog-3-20-2009RLegDigit31 | both | tube |
| dog-3-20-2009Neck1_013 | both | oval |
| dog-3-20-2009Neck2_014 | both | oval |
| dog-3-20-2009Neck3_015 | both | oval |
| dog-3-20-2009Neck4_016 | both | oval |
| dog-3-20-2009Neck5_017 | both | oval |
| dog-3-20-2009Head_00 | both | oval |
| dog-3-20-2009Tail2_039 | both | oval |
| dog-3-20-2009RLeg1_019 | both | oval |
| dog-3-20-2009RLeg2_020 | both | oval |
| dog-3-20-2009RLegPalm_030 | both | tube |
| dog-3-20-2009RLegDigit02_023 | both | tube |
| dog-3-20-2009RLegDigit22_027 | both | sheet |
| dog-3-20-2009RLegDigit32_029 | both | sheet |
| dog-3-20-2009Head_00 | shape-only | oval |
| dog-3-20-2009Ribcage_031 | shape-only | oval |
| dog-3-20-2009Head_00 | shape-only | oval |
| dog-3-20-2009LLeg2 | shape-only | oval |
neck plus30


Surface mean / p90 1.51 / 3.89 cm; p90 growth -0.23 cm; volume +1.3%; intersecting pairs 183 vs truth 0. distance PASS · volume PASS · intersections FAIL
left shoulder plus30


Surface mean / p90 1.55 / 3.95 cm; p90 growth -0.17 cm; volume -2.1%; intersecting pairs 194 vs truth 4. distance PASS · volume PASS · intersections FAIL
left hip plus30


Surface mean / p90 1.59 / 4.19 cm; p90 growth 0.07 cm; volume -0.5%; intersecting pairs 316 vs truth 0. distance PASS · volume PASS · intersections FAIL
tail base plus30


Surface mean / p90 1.57 / 4.09 cm; p90 growth -0.03 cm; volume +0.0%; intersecting pairs 186 vs truth 0. distance PASS · volume PASS · intersections FAIL
Every motion verdict
Automatic weights: solver and empty bone groups
{
"ours": {
"operator_error": null,
"bones_without_positive_weights": [
"dog-3-20-2009LLegDigit02",
"dog-3-20-2009RLegDigit02",
"dog-3-20-2009RLegDigit12"
],
"unweighted_vertices": 0,
"note": "Blender heat solver logs go to blender.log; empty groups identify affected bones, not a per-bone solver diagnostic.",
"failed": false
},
"balls": {
"operator_error": null,
"bones_without_positive_weights": [
"dog-3-20-2009Pelvis_018",
"dog-3-20-2009LLeg1",
"dog-3-20-2009LLeg2",
"dog-3-20-2009LLegPalm",
"dog-3-20-2009LLegDigit02",
"dog-3-20-2009LLegDigit22",
"dog-3-20-2009LLegDigit32",
"dog-3-20-2009Spine1_032",
"dog-3-20-2009Spine2_033",
"dog-3-20-2009Spine3_034",
"dog-3-20-2009LLegPalm_012",
"dog-3-20-2009LLegDigit12_07",
"dog-3-20-2009LLegDigit22_09",
"dog-3-20-2009LLegDigit32_011",
"dog-3-20-2009RLegPalm",
"dog-3-20-2009RLegDigit01_022",
"dog-3-20-2009RLegDigit02",
"dog-3-20-2009RLegDigit11",
"dog-3-20-2009RLegDigit12",
"dog-3-20-2009RLegDigit21",
"dog-3-20-2009RLegDigit22",
"dog-3-20-2009RLegDigit31",
"dog-3-20-2009Tail2_039",
"dog-3-20-2009RLeg1_019",
"dog-3-20-2009RLeg2_020",
"dog-3-20-2009RLegPalm_030",
"dog-3-20-2009RLegDigit02_023",
"dog-3-20-2009RLegDigit22_027",
"dog-3-20-2009RLegDigit32_029"
],
"unweighted_vertices": 0,
"note": "Blender heat solver logs go to blender.log; empty groups identify affected bones, not a per-bone solver diagnostic.",
"failed": false
}
}ours · all bends FAIL
| Pose | p90 / growth cm | Volume | Pairs / truth | Distance / volume / pairs |
|---|---|---|---|---|
| rest | 4.12 / +0.00 | +0.0% | 186 / 0 | rest |
| neck-minus30 | 4.36 / +0.24 | -2.7% | 186 / 0 | PASS / PASS / FAIL |
| neck-plus30 | 3.89 / -0.23 | +1.3% | 183 / 0 | PASS / PASS / FAIL |
| tail-base-minus30 | 4.11 / -0.01 | -0.6% | 186 / 0 | PASS / PASS / FAIL |
| tail-base-plus30 | 4.09 / -0.03 | +0.0% | 186 / 0 | PASS / PASS / FAIL |
| spine-middle-minus30 | 4.29 / +0.18 | -1.9% | 186 / 0 | PASS / PASS / FAIL |
| spine-middle-plus30 | 4.11 / -0.01 | +0.4% | 183 / 0 | PASS / PASS / FAIL |
| left-hip-minus30 | 4.03 / -0.09 | -0.0% | 183 / 0 | PASS / PASS / FAIL |
| left-hip-plus30 | 4.19 / +0.07 | -0.5% | 316 / 0 | PASS / PASS / FAIL |
| left-knee-minus30 | 4.11 / -0.01 | +0.0% | 186 / 0 | PASS / PASS / FAIL |
| left-knee-plus30 | 4.11 / -0.01 | -0.2% | 190 / 0 | PASS / PASS / FAIL |
| left-shoulder-minus30 | 4.17 / +0.05 | +1.0% | 180 / 0 | PASS / PASS / FAIL |
| left-shoulder-plus30 | 3.95 / -0.17 | -2.1% | 194 / 4 | PASS / PASS / FAIL |
| left-elbow-minus30 | 4.12 / +0.00 | +0.2% | 187 / 0 | PASS / PASS / FAIL |
| left-elbow-plus30 | 4.08 / -0.04 | -0.5% | 186 / 0 | PASS / PASS / FAIL |
| right-shoulder-minus30 | 4.21 / +0.09 | +0.8% | 187 / 0 | PASS / PASS / FAIL |
| right-shoulder-plus30 | 3.99 / -0.13 | -1.8% | 186 / 0 | PASS / PASS / FAIL |
| right-elbow-minus30 | 4.11 / -0.01 | +0.4% | 186 / 0 | PASS / PASS / FAIL |
| right-elbow-plus30 | 4.02 / -0.10 | -0.7% | 186 / 0 | PASS / PASS / FAIL |
| right-hip-minus30 | 4.09 / -0.03 | -0.0% | 192 / 0 | PASS / PASS / FAIL |
| right-hip-plus30 | 4.14 / +0.02 | -0.8% | 249 / 0 | PASS / PASS / FAIL |
| right-knee-minus30 | 4.14 / +0.02 | +0.1% | 186 / 0 | PASS / PASS / FAIL |
| right-knee-plus30 | 4.10 / -0.02 | -0.2% | 184 / 0 | PASS / PASS / FAIL |
balls · all bends PASS
| Pose | p90 / growth cm | Volume | Pairs / truth | Distance / volume / pairs |
|---|---|---|---|---|
| rest | 34.16 / +0.00 | +0.0% | 0 / 0 | rest |
| neck-minus30 | 34.43 / +0.27 | -6.1% | 0 / 0 | PASS / PASS / PASS |
| neck-plus30 | 34.22 / +0.06 | +4.3% | 0 / 0 | PASS / PASS / PASS |
| tail-base-minus30 | 33.90 / -0.25 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| tail-base-plus30 | 34.36 / +0.20 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| spine-middle-minus30 | 28.31 / -5.85 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| spine-middle-plus30 | 35.89 / +1.73 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| left-hip-minus30 | 35.09 / +0.93 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| left-hip-plus30 | 32.53 / -1.63 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| left-knee-minus30 | 33.38 / -0.78 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| left-knee-plus30 | 34.42 / +0.26 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| left-shoulder-minus30 | 34.35 / +0.20 | -1.8% | 0 / 0 | PASS / PASS / PASS |
| left-shoulder-plus30 | 33.12 / -1.04 | -0.6% | 0 / 4 | PASS / PASS / PASS |
| left-elbow-minus30 | 34.16 / +0.00 | -0.2% | 0 / 0 | PASS / PASS / PASS |
| left-elbow-plus30 | 34.18 / +0.02 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| right-shoulder-minus30 | 34.34 / +0.19 | -2.2% | 0 / 0 | PASS / PASS / PASS |
| right-shoulder-plus30 | 33.49 / -0.67 | -0.2% | 0 / 0 | PASS / PASS / PASS |
| right-elbow-minus30 | 34.16 / -0.00 | -0.3% | 0 / 0 | PASS / PASS / PASS |
| right-elbow-plus30 | 34.19 / +0.03 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| right-hip-minus30 | 35.11 / +0.95 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| right-hip-plus30 | 32.44 / -1.72 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| right-knee-minus30 | 33.54 / -0.62 | +0.0% | 0 / 0 | PASS / PASS / PASS |
| right-knee-plus30 | 34.44 / +0.29 | +0.0% | 0 / 0 | PASS / PASS / PASS |