BodyRatioMapper SDPose Bone Scale
Stretch one bone at a time on a pose
- pose_keypoint
- pose_keypoint
BodyRatioMapperProportionTransfer is the pack's automatic proportion transfer - you feed it a reference body and it figures out the math. BodyRatioMapperSDPoseBoneScale is the manual version: you grab the dial and stretch a pose one bone at a time. If you know exactly what's wrong with a character - legs too short, shoulders too narrow, head too big for a chibi look - this is the node that fixes it without touching anything else.
It's a per-bone forward-kinematics (FK) chain scaler for SDPose keypoints. "FK" sounds scary; what it means in practice is that when you stretch the upper leg, the knee, ankle, and foot below it come along for the ride instead of floating off. Scaling happens relative to the parent joint, so a longer torso pushes the hips and everything below them down, and a wider shoulder width pushes the elbows, wrists, and hands outward with it. It's the same chain-propagation idea the main ProportionTransfer node uses internally for its reference-to-anchor ratios, exposed here as sliders so you can do it by hand.
The inputs that matter
Only one input is required: pose_keypoint, an SDPose-format skeleton. The output is a new POSE_KEYPOINT you can feed straight into a render node, another scaler, or a ControlNet.
The controls are a dozen float sliders, each scaling a specific part, all defaulting to 1.0 (no change). The ones you'll actually touch:
person_idx- which person to affect, or-1for all of them. This is how you fix one character in a multi-person sequence without wrecking the other.scale_torso- stretches shoulder-mid to hip-mid, the classic "make the body longer" dial.scale_upper_leg/scale_lower_leg- the "make the legs longer" pair. Also the fastest way to get a chibi character's limbs proportionally short (0.5 or so, each).scale_head_x/scale_head_y- anisotropic head scaling, which is genuinely nice: shrink head height but keep width, so the head reads as more stylized rather than just smaller.scale_shoulder_width/scale_hip_width- width dials. Note that widening shoulders pushes the whole arm chain outward, which is the right behavior.
Beyond that there's scale_neck, scale_upper_arm, scale_lower_arm, scale_foot, and scale_hand (the 21 hand points relative to the wrist). Left and right sides are linked - one slider scales both arms - which is almost always what you want for proportions anyway.
One detail worth knowing: the head/face work is a bit opinionated. The face (68 landmarks) is translated with the nose and scaled around its center landmark, so it follows the body rather than getting detached, and hands bind to the wrist before internal scaling. It's the kind of thing you'd expect to be janky and it isn't.
When to reach for it
This is the node you use when the automatic pipeline gets proportions close but not right. The ProportionTransfer node's FK solver averages left/right and can smooth over small errors; when it's off on one specific segment - the torso's too short, say - you don't want to re-run the whole reference matching, you want to patch one chain. Chain this node after ProportionTransfer and before rendering or ControlNet, and dial in the residual error.
It's also great for deliberate style work. Building a consistent chibi skeleton from a normal-pose source is exactly this: torso at 0.7, legs at 0.6, head_x at 1.3, head_y at 1.1, and suddenly the proportions read "cute character" instead of "shrunken adult." Because it's pure geometry on the keypoints, you can stack multiple Bone Scale nodes to get the exact ratio set you want.
Installation and gotchas
Installation is the pack install - see the main BodyRatioMapperProportionTransfer page: clone into custom_nodes, pip install -r requirements.txt, restart. No models to download.
The main gotcha is that all the scale values are relative to 1.0, so a scale of 1.0 is "do nothing," not "full size" - easy to forget when you're dialing in a value and nothing changes. Also, this node expects SDPose-format keypoints (18 body + 6 feet + 68 face + 42 hand points). If your detector emits plain 17-point OpenPose, the extra part arrays will simply be missing and the hand/face dials will silently do nothing. Run your input through pose_keypoint preview if you're unsure what you're feeding it.
There's one more subtlety worth flagging: scale_shoulder_width shifts arms by translating the elbow/wrist chain, and scale_neck moves the head and face but leaves the body in place. Combined, these are technically approximations of a real skeleton - but they're exactly the approximations you want when the alternative is redrawing a pose by hand.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_keypoint | POSE_KEYPOINT | Input SDPose POSE_KEYPOINT | |
| person_idxopt | INT | -1-1–100 | Person index to scale. -1 = all persons. |
| scale_head_xopt | FLOAT | 1.000.1–3 | Head + face X scale (nose/eyes/ears/face relative to neck) |
| scale_head_yopt | FLOAT | 1.000.1–3 | Head + face Y scale (nose/eyes/ears/face relative to neck) |
| scale_neckopt | FLOAT | 1.000.1–3 | Neck length scale (shoulder_mid to neck distance) |
| scale_shoulder_widthopt | FLOAT | 1.000.1–3 | Shoulder width (distance between L/R shoulders) |
| scale_upper_armopt | FLOAT | 1.000.1–3 | Upper arm scale (shoulder to elbow, L+R linked) |
| scale_lower_armopt | FLOAT | 1.000.1–3 | Lower arm scale (elbow to wrist, L+R linked) |
| scale_torsoopt | FLOAT | 1.000.1–3 | Torso length scale (shoulder_mid to hip_mid) |
| scale_hip_widthopt | FLOAT | 1.000.1–3 | Hip width (distance between L/R hips) |
| scale_upper_legopt | FLOAT | 1.000.1–3 | Upper leg scale (hip to knee, L+R linked) |
| scale_lower_legopt | FLOAT | 1.000.1–3 | Lower leg scale (knee to ankle, L+R linked) |
| scale_footopt | FLOAT | 1.000.1–3 | Foot internal scale (3 foot points relative to ankle) |
| scale_handopt | FLOAT | 1.000.1–3 | Hand internal scale (21 hand points relative to wrist, L+R linked) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pose_keypoint | POSE_KEYPOINT | — |