Pose Composer 3D
A Kinematic Skeleton With Actual Camera Angles
- pose
- guide
- prop_mask
- prop_hint
Most pose tools make you draw a stick figure in 2D and pray it reads as "three-quarter view." CP_PoseComposer3D skips the praying: it builds the pose in actual 3D - a kinematic skeleton, joint angles applied per-bone, a perspective camera orbiting it - then projects the result down to a 2D OpenPose canvas. That's why its camera presets (S, SE, E, NE, N, NW, W, SW) actually look like different angles instead of the same skeleton rotated in the flat plane.
It's the creative core of the pack, and CP_PoseTransferPrep is really just this node wrapped with a captioner. If you want to fiddle with poses directly - or drive them from a text prompt - this is where the knobs live.
How it works
A 3D humanoid skeleton with FK joint angles gets posed, a perspective camera (fov 35° by default) looks at it from one of eight isometric positions, and the 3D joint positions are projected to 2D pixel keypoints. Props attach to joints as 3D polylines and are drawn in cyan on the guide - over the OpenPose sticks, so the body's COCO-18 keypoints stay untouched for ControlNet compatibility. The prop is a visual hint plus a prompt string, not a separate conditioning channel.
pose_source has two modes:
- library - pick a named action (
idle,walk_01..04,run_01..04,jump,fight_01/02,work_01/02,cast,ride_idle). - text - describe a pose and the node calls an OpenAI-compatible chat API to get Euler joint angles back, then clamps them to per-joint limits so the pose doesn't break. Defaults point at
https://api.openai.com/v1withgpt-4o-mini; point it athttp://127.0.0.1:11434/v1for a local Ollama (llama3.2, any non-empty key). It also honorsCHARACTERPOSE_LLM_API_KEYorOPENAI_API_KEYas env fallbacks.
The inputs that matter
- camera_preset - the eight compass positions.
SE(¾ front-right) is the default and the RPG-sprite standard. - use_manual_camera - off by default, in which case
yaw/pitch/rollare fine-tune offsets on the preset. Flip it on for absolute yaw/pitch/roll control. - prop / prop2 -
sword,shield,staff,bow,horse, ornone. - action (library) or pose_prompt + the llm_* trio (text).
Outputs: pose (the POSE object), guide (the drawn OpenPose guide image), prop_mask (the prop strokes as a mask - feed it to a canny preprocessor yourself if you want a real ControlNet channel), and prop_hint (the text hint to inject into your prompt).
Installing
Same pack as always:
cd ComfyUI/custom_nodes
git clone https://github.com/Spit8/_ComfyUI_CharacterPose
pip install -r _ComfyUI_CharacterPose/requirements.txt
Restart ComfyUI; it's under CharacterPose/Pose. The text-pose mode needs network access to whatever LLM endpoint you configure; library mode needs nothing.
Gotchas
- Text mode calls an API. It's OpenAI-compatible and needs no key for local Ollama, but the default config does hit api.openai.com - if you don't want that, set the base URL first.
- A 3D pose projected to 2D still lands with the same-view bias every pose pipeline has: a ¾ pose is genuinely a ¾ pose. Don't expect the composer to conjure a camera angle the skeleton can't physically present.
- Props are guide strokes + prompt hints, full stop. If you need a hard prop lock, you'll be feeding
prop_maskto your own ControlNet canny channel.
The node that makes "same character, eight different camera angles" a dropdown instead of a struggle. For game sprites, that's most of the job.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_source | COMBO | library | 2 options: library, text |
| action | COMBO | idle | 16 options: cast, fight_01, fight_02, idle, jump, ride_idle, +10 |
| camera_preset | COMBO | SE | 8 options: S, SE, E, NE, N, NW, +2 |
| yaw | FLOAT | 0-180–180 | — |
| pitch | FLOAT | 0-60–60 | — |
| roll | FLOAT | 0-30–30 | — |
| distance | FLOAT | 0.000–8 | — |
| use_manual_camera | BOOLEAN | false | — |
| width | INT | 102464–4096 | — |
| height | INT | 102464–4096 | — |
| prop | COMBO | none | 6 options: none, sword, shield, staff, bow, horse |
| prop2opt | COMBO | none | 6 options: none, sword, shield, staff, bow, horse |
| fov_degopt | FLOAT | 3515–90 | — |
| pose_promptopt | STRING | — | |
| llm_base_urlopt | STRING | https://api.openai.com/v1 | — |
| llm_modelopt | STRING | gpt-4o-mini | — |
| llm_api_keyopt | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| pose | POSE | — |
| guide | IMAGE | — |
| prop_mask | IMAGE | — |
| prop_hint | STRING | — |