ProportionChanger Params
The slider farm that stretches your character's limbs
- pose_keypoint
- changed_pose_keypoint
This is the node that gives the pack its name. ProportionChanger Params is a direct keypoint editor: you give it a pose and it lets you stretch, squash, rotate, and shift individual body parts by pushing sliders - no image rendering, no re-detection, just pure arithmetic on the skeleton. Want a chibi with a giant head and stubby legs? A long-legged model whose torso stays put? This is where you do it.
The reason this works at all is that the pack operates on pose keypoints rather than on rendered OpenPose images. DWPose-style skeletons are just numbered joints with coordinates, and the pack's whole design bet is that you can edit those numbers directly and hand the result to a ControlNet-style conditioning step downstream. This node is the manual editing surface for that bet - the ported heart of toyxyz's ComfyUI-ultimate-openpose-editor, reworked to touch keypoint data instead of pixels.
What you actually set
There are around two dozen sliders, which sounds like a lot until you realize they group cleanly:
- Body part scales -
head_scale,neck_scale,shoulder_scale,torso_scale,pelvis_scale, and the arms/legs broken out intoupper_arm_scale/lower_arm_scaleandthigh_scale/lower_leg_scale, plusfeet_scale. 1.0 is untouched; 1.5 is 50% longer. - Face -
face_shape_scale,eye_distance_scale,eye_height,eyebrow_height, and per-side eye/eyebrow scales. Handy for the slightly-too-big-face problem. - Global transform -
overall_scale(everything at once),rotate_angle, andtranslate_x/translate_yto move or tilt the whole figure.
The pose_keypoint input is optional, which is the one real surprise: the node will happily run with nothing connected, so wire it to a detector, a Reference node, or a PoseData to pose_keypoint output. The output is changed_pose_keypoint, ready for the Pose Render node or straight into your video conditioning.
One small detail worth knowing: the node has a cache-busting IS_CHANGED that forces ComfyUI to re-run it whenever you touch a slider, so your preview updates live instead of silently reusing a stale result. That's the right call for an editor, even if it means it always recomputes.
Install and gotchas
Part of the one-pack install - ComfyUI Manager search "ComfyUI-ProportionChanger", or:
cd ComfyUI/custom_nodes
git clone https://github.com/grmchn/ComfyUI-ProportionChanger.git
cd ComfyUI-ProportionChanger
pip install -r requirements.txt
Restart after. The usual failure mode isn't the node itself, it's what feeds it: if the upstream pose detection was weak, you'll be stretching a skeleton that was already wrong, and no amount of leg_scale fixes a missed knee. Check the detected pose in the Pose Render node before you edit. And remember the max ranges are wide (legs go to 10×) but the defaults are all 1.0 - small steps, because a 2× head looks intentional and a 4× head looks cursed.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_keypointopt | POSE_KEYPOINT | — | |
| head_scaleopt | FLOAT | 1.000–5 | — |
| neck_scaleopt | FLOAT | 1.000–10 | — |
| shoulder_scaleopt | FLOAT | 1.000–10 | — |
| arm_scaleopt | FLOAT | 1.000–10 | — |
| upper_arm_scaleopt | FLOAT | 1.000–10 | — |
| lower_arm_scaleopt | FLOAT | 1.000–10 | — |
| torso_scaleopt | FLOAT | 1.000–10 | — |
| pelvis_scaleopt | FLOAT | 1.000–10 | — |
| leg_scaleopt | FLOAT | 1.000–10 | — |
| thigh_scaleopt | FLOAT | 1.000–10 | — |
| lower_leg_scaleopt | FLOAT | 1.000–10 | — |
| feet_scaleopt | FLOAT | 1.000–10 | — |
| face_shape_scaleopt | FLOAT | 1.000–5 | — |
| eyebrow_heightopt | FLOAT | 0.0-100–100 | — |
| left_eyebrow_scaleopt | FLOAT | 1.000–5 | — |
| right_eyebrow_scaleopt | FLOAT | 1.000–5 | — |
| eye_distance_scaleopt | FLOAT | 1.000–5 | — |
| eye_heightopt | FLOAT | 0.0-100–100 | — |
| left_eye_scaleopt | FLOAT | 1.000–5 | — |
| right_eye_scaleopt | FLOAT | 1.000–5 | — |
| nose_scale_faceopt | FLOAT | 1.000–5 | — |
| mouth_scaleopt | FLOAT | 1.000–5 | — |
| hands_scaleopt | FLOAT | 1.000–10 | — |
| overall_scaleopt | FLOAT | 1.000–10 | — |
| rotate_angleopt | FLOAT | 0.0-360–360 | — |
| translate_xopt | FLOAT | 0.0-10000–10000 | — |
| translate_yopt | FLOAT | 0.0-10000–10000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| changed_pose_keypoint | POSE_KEYPOINT | — |