3D Pose Editor
Drag a 3D doll around, get four ControlNet conditions out
- OpenPose
- Depth
- Normal
- Canny
You know the annoying part of pose ControlNet? The pose comes first. You either have a reference photo that sort of matches, or you're hand-drawing skeletons and praying. 3D Pose Editor is the fix for the second half: it drops an actual 3D mannequin inside the node, you grab its joints and drag arms, legs, torso, hands into the pose you want, and it renders that pose straight into ControlNet-ready images. No sketchy online editor, no API, no key, no GPU work. It's a digital doll editor wearing a ComfyUI coat.
Here's the fun part: the "AI" is a lie. This node runs zero inference. It's a port of ZhUyU1997's open-pose-editor browser app, bundled by Hina Chen - a pack whose load-method fixes credit ltdrdata, the ComfyUI Manager author, so this is ecosystem-native, not a stranger's half-baked idea. All the heavy lifting happens client-side in three.js. Your GPU just sighs in relief.
How it works
Drop the node on the canvas and it embeds an iframe with a 3D scene right in the node body. The frontend extension (web/openposeeditor.js) is the actual glue: every time you release the mouse in the editor, it waits ~300ms, asks the 3D scene to render four images - the OpenPose skeleton, a depth map, a normal map, and a canny edge map - then uploads each to ComfyUI's /upload/image endpoint into a temp/3dposeeditor/ folder. The Python half is almost embarrassingly small: it lists that folder, loads whichever files you pick, converts them to float tensors, and hands you four IMAGE outputs. IS_CHANGED hashes the pose file so ComfyUI knows to re-run the graph when you move a joint.
The inputs and outputs that matter
Inputs are four optional dropdowns - pose, depth, normal, canny - each listing the saved renders in that temp folder. Set all four and you get all four conditions in one shot, which is the point if you're running multi-ControlNet (OpenPose + depth is the classic combo for person-in-scene).
Outputs are OpenPose, Depth, Normal, and Canny, all IMAGE tensors, each a batch of one ([1, H, W, 3]). Wire them straight into a ControlNet node - the openpose/DWPose preprocessor for the skeleton, depth/normal/canny preprocessors for the rest. Two traps: if pose isn't set, the node returns None for everything, and it only speaks OpenPose-style skeletons, not the DWPose format (a request for DWPose output has been open since 2024).
Installing it
ComfyUI Manager → search ComfyUI 3D Pose Editor, or:
cd ComfyUI/custom_nodes
git clone https://github.com/hinablue/ComfyUI_3dPoseEditor
Restart ComfyUI, then hard-refresh the browser (Ctrl+Shift+R). No pip install, no model downloads, no heavy dependencies - everything is either ComfyUI's own PIL/torch or the browser's three.js. That's rare in this ecosystem, and worth appreciating while it lasts.
Common issues & troubleshooting
Real ones, in the order people actually hit them:
- The editor displays weird or sits offset under newer ComfyUI. The embedded-iframe trick is fragile, and the pack has been quiet since early 2024. A 2025 r/comfyui thread ("Why does 3D Pose Editor display weird?") plus GitHub issues #29 and #34 all cover the editor rendering wrong on the newer UI. Reload the browser first; a margin glitch may just live with you.
- Your poses vanish on restart. Everything lives in ComfyUI's temp folder, and ComfyUI wipes temp on startup. Empty dropdowns after a restart are expected, not a bug - don't leave a pose you love unsaved.
- The output doesn't change after you move a joint. ComfyUI caching is the usual suspect. The README itself warns that feeding the same inputs into an Efficient Nodes KSampler won't refresh - bump the seed or bypass to force a re-queue. And because
IS_CHANGEDonly hashes the pose file, swapping the depth or normal file alone won't trigger a re-run either. - Import fails on Python 3.12. The
__init__.pystill importsdistutils, which was removed in 3.12 - most "IMPORT FAILED" reports trace here.
Bottom line: when you need a character exactly in a pose - a specific gesture, a hand placement, a composition - grabbing the joint beats any preprocessor. It's manual, so it's slow for animation, and in 2026 the pose slice of ControlNet is smaller than it used to be as instruction-editing models ate "change this character's pose." But for precise one-off control on SD1.5, SDXL, or Flux pose unions, this is the one you'd actually reach for.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| poseopt | COMBO | 0 options: | |
| depthopt | COMBO | 0 options: | |
| normalopt | COMBO | 0 options: | |
| cannyopt | COMBO | 0 options: |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| OpenPose | IMAGE | — |
| Depth | IMAGE | — |
| Normal | IMAGE | — |
| Canny | IMAGE | — |