Nodes/open-pose-rotator/OpenPose Rotator
ComfyUI Node

OpenPose Rotator

Turn your pose around — rotate an OpenPose skeleton before ControlNet ever sees it

By emausb·Created 6 months ago·Updated 6 months ago· 1
OpenPose Rotator
  • image
  • pose_keypoint
  • IMAGE
  • POSE_KEYPOINT
direction
degrees45
mode
debugfalse
recentertrue
draw_face_meshtrue

You found a pose you love and the only thing wrong with it is that the figure faces the wrong way. Prompting rarely fixes that - diffusion doesn't work like a 3D model, and the standard advice is "just regenerate" or "edit-model it." OpenPose Rotator takes the other route: it edits the pose map itself. You feed it a pose image, it spins the skeleton around the torso, and the rotated OpenPose map goes straight into ControlNet. Same figure, same limbs, new orientation.

This is the node from emausb/ComfyUI-Openpose-Rotator (pack title "open-pose-rotator"), and it's a one-trick pack. The trick is just more useful than it sounds once you're doing pose-heavy ControlNet work.

How it actually works

No ML magic here, which is both the charm and the limitation. The node takes your OpenPose/DWPose keypoints, finds the torso pivot from neck/shoulders/hips, and assigns every body part a depth value based on anatomical proportions (the OpenPose COCO body indices have limb-specific depth scales baked in). Then it rotates those 3D-ish coordinates around the torso axis by your chosen angle and projects them back to 2D. Because the depth is geometry, there's no model download, no GPU hit, nothing to tune at first.

There's real anatomy-awareness in there for a small node: shoulders get a different depth scale than wrists, hands rotate with the head, and once you pass ~90° the face/head keypoints get hidden because you're looking at the back of the skull. Points behind the torso are occluded and limbs draw in depth order, so the output isn't a garbled stick-figure pretzel.

One thing worth knowing: the README talks about perspective and focal_length knobs, but the node you actually install doesn't expose them. The shipped code auto-derives both (a fixed 35° camera elevation and ~90% figure fill). The interface is simpler than the docs suggest.

The inputs that matter

Of the required four, you mostly touch two:

  • direction - clockwise or counterclockwise. Read it as "viewed from above": clockwise turns the figure to its right.
  • degrees - 1–360, default 45. 90 is a profile turn, 180 is facing away.

Then mode, simple or advanced. Simple (the one you want) does orthographic projection with perspective-modulated depth - fine for eye-level shots. Advanced applies true perspective projection with foreshortening, which is meant for non-eye-level sources but is fiddlier and easier to get weird. Start simple.

Optional inputs worth knowing: pose_keypoint - connect this from a DWPose/OpenPose preprocessor for accurate results. Skip it and the node quietly runs DWPose itself via comfyui-controlnet-aux. recenter (default on) horizontally re-centers the rotated figure in the frame. draw_face_mesh controls whether the 70-point face mesh survives the turn.

Outputs are IMAGE - the rotated pose map, wired into a ControlNet Apply node as your condition - and POSE_KEYPOINT, the rotated keypoints if you want them for further processing.

Installing it

ComfyUI Manager: search "open-pose-rotator" and hit install. Or manually:

cd ComfyUI/custom_nodes
git clone https://github.com/emausb/ComfyUI-Openpose-Rotator

Then rename the folder - this bit bites. It must be a valid Python module name, so open_pose_rotator (underscores), not open-pose-rotator, or ComfyUI can't import it. Restart ComfyUI after.

Dependencies are numpy, opencv-python, torch - all things ComfyUI already ships. There's no heavy install and no model to fetch. The one extra: if you want image-only mode (no keypoints connected), you need comfyui-controlnet-aux installed for the DWPose fallback. If you're feeding keypoints in anyway, skip it.

Gotchas

The README's own warning deserves quoting: this is under active development and "does not work well yet." Treat results as a starting point, not a finished pose. If it can't detect a torso, it silently returns the input image unchanged - no crash, no error, you just get your original pose back, which can look like the node did nothing. That's also what happens with image-only input when controlnet-aux is missing. Realistic best case: a pose that's convincing enough for ControlNet to guide toward - which, given the alternative (redrawing the skeleton by hand), is a genuine time-saver.

Workflow

Load Image → DWPose Estimator → OpenPose Rotator (connect both IMAGE and POSE_KEYPOINT) → ControlNet Apply → sampler. That's the whole shape of it. It's niche, and its output won't be perfect - but when you need a figure turned around without regenerating until the gods smile, it's the only node doing this exact job.

Categoryimage/pose

Inputs (8)

NameTypeDefaultDescription
imageIMAGE
directionCOMBO2 options: clockwise, counterclockwise
degreesINT451–360
modeCOMBO2 options: simple, advanced
pose_keypointoptPOSE_KEYPOINT
debugoptBOOLEANfalse
recenteroptBOOLEANtrue
draw_face_meshoptBOOLEANtrue

Outputs (2)

NameTypeDescription
IMAGEIMAGE
POSE_KEYPOINTPOSE_KEYPOINT