Blend only what is jointed
The natural way to build a character from primitives is to smin
everything together in a chain. It works right up until two parts that are not
connected come close to each other, and then material grows between them out of
nowhere.
On the left, the forearm webs to the torso every time it passes close. It looks like the figure is made of putty, and it is worst exactly when the pose is most expressive, because that is when limbs come near the body.
The field has no skeleton
smin blends by proximity, and proximity is not connectivity. Two parts
that are close in space get joined whether or not anything joins them anatomically. The
field genuinely does not have the information needed to do better, so it has to be
supplied.
// wrong: everything blends with everything
d = smin(smin(smin(torso, head, k), upper, k), fore, k);
// right: an ADJACENCY list. blend at real joints, hard-union the rest
float arm = smin(upper, fore, k); // elbow
float body = smin(torso, head, k); // neck
float attached = smin(body, upper, k);// shoulder
d = min(attached, arm); // forearm and torso: not adjacent
The permission structure
In practice this becomes a small table alongside the skeleton: for each pair of parts,
may they blend, and at what radius. Most pairs are min. The blending ones
are exactly the bones that share a joint, which means the table is not extra authoring,
it is the skeleton you already have.
The radius usually wants to vary per joint too. A shoulder is a broad soft transition;
a wrist is tight. One global k is the same failure as the
constant blend radius, one level up.
The seam you get in exchange
Being honest about the cost: a hard min between a limb and a body leaves a
crease where they overlap, and a crease is a discontinuity in the gradient. Anything
reading the gradient will show it as a hard line, and a central-difference normal will
be garbage right along it.
Two mitigations. Use a very small blend rather than a true min for
non-adjacent pairs, which softens the crease without letting them fuse. Or accept the
crease and make sure the parts do not actually intersect in the poses you ship, which
is what a real skeleton does anyway.
Rules of thumb
- Blend at joints. Hard-union everything else.
- The adjacency table is the skeleton you already have, not new authoring.
- Per-joint blend radius: broad at the shoulder, tight at the wrist.
- If limbs web to the body when the pose gets interesting, this is the bug.
- A tiny blend beats a true
minfor non-adjacent pairs, because it softens the gradient crease without fusing them.
One email when something new goes up. No newsletter, no schedule, nothing else.
Double opt-in, so watch for a confirmation email. Unsubscribe any time.