All writing
Retargeting

Retargeting to R15 is a proportion problem, not an angle problem

Fifteen boxes on Motor6Ds is not a small human. Treating it like one is what produces the uncanny, slightly-off look people associate with generated animation.

The instinct with retargeting is to map joints by name and copy rotations across. It is simple, it is fast, and it is why so much generated animation looks subtly wrong on a Roblox avatar.

Consider a character reaching for something at chest height. On a human skeleton the arm extends to a particular point. On R15 the upper arm is proportionally shorter and the torso is wider, so the same shoulder and elbow angles put the hand somewhere else entirely — short of the target, and angled oddly.

Solving it means treating the end effector position as the thing to preserve, scaled into R15 space, and re-deriving the joint angles from there. Limb ratios are read from the actual rig you are targeting, which is why the same generation lands correctly on a blocky default avatar and on a tall Rthro body without being re-run.

It also has a pleasant consequence: since the solve is deterministic and runs on CPU, retargeting an old generation to a new rig costs nothing. Generation and retarget are genuinely separate stages, and only one of them needs a GPU.