Dog: shape and motion proof of concept

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.
Walk-like cycle: real model left, ours right
Walk-like cycle from the side (legs swing in diagonal pairs, head nods, tail wags)
Neck: real model left, ours right
Neck · nods down and up, 30 degrees each way
Left shoulder: real model left, ours right
Left shoulder · front leg swings, 30 degrees each way
Left elbow: real model left, ours right
Left elbow · lower front leg bends, 30 degrees each way
Left hip: real model left, ours right
Left hip · hind leg swings, 30 degrees each way
Left knee: real model left, ours right
Left knee · lower hind leg bends, 30 degrees each way
Middle of the back: real model left, ours right
Middle of the back · front half rises and drops, 30 degrees each way
Tail (seen from behind): real model left, ours right
Tail (seen from behind) · tail stub lifts and tucks, 30 degrees each way

Three-quarter · rest

Real model · reference
Real model · reference
Shapes on bones
Shapes on bones
Balls-only baseline
Balls-only baseline

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

Real model · reference
Real model · reference
Shapes on bones
Shapes on bones
Balls-only baseline
Balls-only baseline

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

Four input pictures · reference
Four input pictures · reference
Green: both. Red dashed: motion-only.
Green: both. Red dashed: motion-only.
Orange: tubes. Blue: ovals. Purple: sheets. Black: shape-only attachment.
Orange: tubes. Blue: ovals. Purple: sheets. Black: shape-only attachment.

{'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 / ownerKindShape
dog-3-20-2009LLeg1bothoval
dog-3-20-2009LLeg2bothoval
dog-3-20-2009LLegPalmbothtube
dog-3-20-2009LLegDigit32bothsheet
dog-3-20-2009Spine1_032bothoval
dog-3-20-2009Spine2_033bothoval
dog-3-20-2009Spine3_034bothoval
dog-3-20-2009Ribcage_031bothtube
dog-3-20-2009LLegCollarbone_03bothoval
dog-3-20-2009LLeg1_01bothoval
dog-3-20-2009LLeg2_02bothoval
dog-3-20-2009LLegPalm_012bothtube
dog-3-20-2009LLegDigit12_07bothtube
dog-3-20-2009LLegDigit22_09bothtube
dog-3-20-2009LLegDigit32_011bothtube
dog-3-20-2009RLegCollarbone_021bothoval
dog-3-20-2009RLeg1bothoval
dog-3-20-2009RLeg2bothoval
dog-3-20-2009RLegPalmbothtube
dog-3-20-2009RLegDigit01_022bothtube
dog-3-20-2009RLegDigit02bothsheet
dog-3-20-2009RLegDigit11bothtube
dog-3-20-2009RLegDigit12bothoval
dog-3-20-2009RLegDigit21bothtube
dog-3-20-2009RLegDigit22bothoval
dog-3-20-2009RLegDigit31bothtube
dog-3-20-2009Neck1_013bothoval
dog-3-20-2009Neck2_014bothoval
dog-3-20-2009Neck3_015bothoval
dog-3-20-2009Neck4_016bothoval
dog-3-20-2009Neck5_017bothoval
dog-3-20-2009Head_00bothoval
dog-3-20-2009Tail2_039bothoval
dog-3-20-2009RLeg1_019bothoval
dog-3-20-2009RLeg2_020bothoval
dog-3-20-2009RLegPalm_030bothtube
dog-3-20-2009RLegDigit02_023bothtube
dog-3-20-2009RLegDigit22_027bothsheet
dog-3-20-2009RLegDigit32_029bothsheet
dog-3-20-2009Head_00shape-onlyoval
dog-3-20-2009Ribcage_031shape-onlyoval
dog-3-20-2009Head_00shape-onlyoval
dog-3-20-2009LLeg2shape-onlyoval

neck plus30

Real model posed · reference
Real model posed · reference
Our model posed
Our model posed

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

Real model posed · reference
Real model posed · reference
Our model posed
Our model posed

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

Real model posed · reference
Real model posed · reference
Our model posed
Our model posed

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

Real model posed · reference
Real model posed · reference
Our model posed
Our model posed

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

Posep90 / growth cmVolumePairs / truthDistance / volume / pairs
rest4.12 / +0.00+0.0%186 / 0rest
neck-minus304.36 / +0.24-2.7%186 / 0PASS / PASS / FAIL
neck-plus303.89 / -0.23+1.3%183 / 0PASS / PASS / FAIL
tail-base-minus304.11 / -0.01-0.6%186 / 0PASS / PASS / FAIL
tail-base-plus304.09 / -0.03+0.0%186 / 0PASS / PASS / FAIL
spine-middle-minus304.29 / +0.18-1.9%186 / 0PASS / PASS / FAIL
spine-middle-plus304.11 / -0.01+0.4%183 / 0PASS / PASS / FAIL
left-hip-minus304.03 / -0.09-0.0%183 / 0PASS / PASS / FAIL
left-hip-plus304.19 / +0.07-0.5%316 / 0PASS / PASS / FAIL
left-knee-minus304.11 / -0.01+0.0%186 / 0PASS / PASS / FAIL
left-knee-plus304.11 / -0.01-0.2%190 / 0PASS / PASS / FAIL
left-shoulder-minus304.17 / +0.05+1.0%180 / 0PASS / PASS / FAIL
left-shoulder-plus303.95 / -0.17-2.1%194 / 4PASS / PASS / FAIL
left-elbow-minus304.12 / +0.00+0.2%187 / 0PASS / PASS / FAIL
left-elbow-plus304.08 / -0.04-0.5%186 / 0PASS / PASS / FAIL
right-shoulder-minus304.21 / +0.09+0.8%187 / 0PASS / PASS / FAIL
right-shoulder-plus303.99 / -0.13-1.8%186 / 0PASS / PASS / FAIL
right-elbow-minus304.11 / -0.01+0.4%186 / 0PASS / PASS / FAIL
right-elbow-plus304.02 / -0.10-0.7%186 / 0PASS / PASS / FAIL
right-hip-minus304.09 / -0.03-0.0%192 / 0PASS / PASS / FAIL
right-hip-plus304.14 / +0.02-0.8%249 / 0PASS / PASS / FAIL
right-knee-minus304.14 / +0.02+0.1%186 / 0PASS / PASS / FAIL
right-knee-plus304.10 / -0.02-0.2%184 / 0PASS / PASS / FAIL

balls · all bends PASS

Posep90 / growth cmVolumePairs / truthDistance / volume / pairs
rest34.16 / +0.00+0.0%0 / 0rest
neck-minus3034.43 / +0.27-6.1%0 / 0PASS / PASS / PASS
neck-plus3034.22 / +0.06+4.3%0 / 0PASS / PASS / PASS
tail-base-minus3033.90 / -0.25+0.0%0 / 0PASS / PASS / PASS
tail-base-plus3034.36 / +0.20+0.0%0 / 0PASS / PASS / PASS
spine-middle-minus3028.31 / -5.85+0.0%0 / 0PASS / PASS / PASS
spine-middle-plus3035.89 / +1.73+0.0%0 / 0PASS / PASS / PASS
left-hip-minus3035.09 / +0.93+0.0%0 / 0PASS / PASS / PASS
left-hip-plus3032.53 / -1.63+0.0%0 / 0PASS / PASS / PASS
left-knee-minus3033.38 / -0.78+0.0%0 / 0PASS / PASS / PASS
left-knee-plus3034.42 / +0.26+0.0%0 / 0PASS / PASS / PASS
left-shoulder-minus3034.35 / +0.20-1.8%0 / 0PASS / PASS / PASS
left-shoulder-plus3033.12 / -1.04-0.6%0 / 4PASS / PASS / PASS
left-elbow-minus3034.16 / +0.00-0.2%0 / 0PASS / PASS / PASS
left-elbow-plus3034.18 / +0.02+0.0%0 / 0PASS / PASS / PASS
right-shoulder-minus3034.34 / +0.19-2.2%0 / 0PASS / PASS / PASS
right-shoulder-plus3033.49 / -0.67-0.2%0 / 0PASS / PASS / PASS
right-elbow-minus3034.16 / -0.00-0.3%0 / 0PASS / PASS / PASS
right-elbow-plus3034.19 / +0.03+0.0%0 / 0PASS / PASS / PASS
right-hip-minus3035.11 / +0.95+0.0%0 / 0PASS / PASS / PASS
right-hip-plus3032.44 / -1.72+0.0%0 / 0PASS / PASS / PASS
right-knee-minus3033.54 / -0.62+0.0%0 / 0PASS / PASS / PASS
right-knee-plus3034.44 / +0.29+0.0%0 / 0PASS / PASS / PASS