PromptChain 3D Poser
Pose a scene instead of hunting for a reference image
- IMAGE
- POSE_JSON
- MASKS
Getting two characters into a specific pose with plain ControlNet usually means finding a reference image that already roughly matches what you want, or turning yourself into an amateur figure-drawing app with an OpenPose editor. The 3D Poser skips that: you pose an actual mannequin - full body, IK, per-finger hands, foot pinning - right on the ComfyUI canvas, and it hands you a control map plus, just as importantly, a mask for every figure in the scene.
How it works
This is the node that makes the rest of the pack's multi-character machinery possible. You stage figures (people, or first-class rigged creatures like a horse or a cat), reshape them live with a MakeHuman-derived slider engine - height, weight, muscle, age, applied instantly with no rebake - pose them with move/rotate/scale gizmos, and drop in props from a categorized library or your own imported .glb/.obj. The scene compiles down to a depth or OpenPose control map, and - the part a plain pose editor can't give you - a per-figure silhouette mask plus a JSON blob naming every figure and prop in the scene. That JSON is what lets a $name{...} block in your Prompt Chain prompt find the exact mask that belongs to it, even after you rename a figure.
The inputs and outputs that matter
control_map and pose_state are the two required string fields, and neither is something you type - they're the serialized scene state the browser-side 3D panel writes back into the node, the same pattern as Prompt Chain's own editor. width and height (defaulting to a portrait 832×1216) set the resolution the control map and masks come out at - match these to whatever you're actually sampling at.
Three outputs:
IMAGE- the compiled depth/OpenPose control map, which goes into a ControlNet apply node same as any other preprocessor output.POSE_JSON- the figure-name and head-position data. Wire it into any of the pack's regional nodes' optionalposeinput so renamed$name{}blocks bind correctly, or into Regional Detailer'sposeinput to unlock its "mannequin heads" detection mode.MASKS- the per-figure silhouette masks, straight into themasksoptional input on Attention Couple, Regional Conditioning, or Z-Image Regional Couple.
How to install it
Manager: search ComfyUI-PromptChain. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/mobcat40/ComfyUI-PromptChain.git
Restart, add the node, and the pack's onboarding flow handles the rest - including offering to self-install ControlNet support if you don't already have it, since the Poser is only useful once its control map reaches a ControlNet-conditioned sampler. The pack also bundles its own license-clean OpenPose and Depth preprocessors, so you're not separately dependent on comfyui_controlnet_aux to use what this node produces.
Common issues & troubleshooting
A figure's mask isn't matching its prompt block. Same trap as Prompt Chain itself: $name{} binds by name, and if you renamed a figure in the Poser after writing the prompt, wire POSE_JSON into the regional node's pose input - that's specifically what carries the current names across so a rename doesn't break the binding.
You don't actually need full 3D posing. If you just want "character on the left, character on the right" with no specific pose, PromptChain Region Boxes (PromptChain_RegionBox) gives you the same MASKS/POSE_JSON output pair from flat rectangles instead - much faster to set up when you don't need a posed mannequin.
It's beta. Same standing caveat as the rest of the pack: an early public release, subject to breaking changes between updates. A tool this ambitious - full IK, mesh sculpting, freehand geometry, all running in a ComfyUI node - is exactly the kind of thing worth the roughness while it settles.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| control_map | STRING | — | |
| pose_state | STRING | — | |
| width | INT | 83264–4096 | — |
| height | INT | 121664–4096 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| POSE_JSON | STRING | — |
| MASKS | MASK | — |