Pose Transfer Prep
The One Node That Runs the Whole Fast Pipeline
- image
- pose_keypoint
- dwpose_image
- source_pose
- guide
- edit_prompt
- pose
- source_pose
- preview_pose
- caption
- caption_backend
This is the node the README points you at first, and it's the pack's real headline act. CP_PoseTransferPrep takes a single sprite and does everything - captions the character, composes a 3D pose with camera angle and props, aligns it to your sprite - and hands you two things: a guide image and an edit_prompt string. Feed those to Flux.2 Klein with the sprite as a second reference and you get your hero in a new pose in roughly four steps.
It collapses what used to be a five-node graph (caption + palette + 3D compose + align + prompt assembly) into one box. If you're evaluating this pack, this is the node that either convinces you or doesn't.
How it works
Three stages inside:
- Caption - if
auto_captionis on (default), it runs the Florence-2 + palette hex color-lock machinery (seeCP_CharacterCaption) to describe the character. Notransformersinstalled? It still injects the K-means color palette, just without the rich caption. - Compose - the
CP_PoseComposer3Dmachinery: pick an action (library) or describe a pose (text → LLM → joint angles), pick a camera preset and props, get a projected OpenPose guide. - Align - if
align_to_sourceis on (default), the target pose is scaled and translated to match your sprite's size, so the guide lines up with the character instead of floating somewhere else on the canvas.
The inputs that matter
- image - your sprite. The whole point of the node.
- action / camera_preset / prop - the pose: e.g.
run_02,SE,sword. - pose_source -
library(default) ortext(LLM-driven, same OpenAI-compatible config as the composer). - auto_caption - on by default. Turn it off if you're passing
caption_override. - pose_keypoint / dwpose_image - optional source pose from a
DWPreprocessor. WirePOSE_KEYPOINT→pose_keypointfor alignment plus a stick overlay;IMAGE→dwpose_imagefor pixel-perfect sticks. Without either, the node shows the sprite alone - it deliberately does not invent a fake T-pose placeholder.
Outputs: guide (the aligned OpenPose guide image - ref 2 in the Klein workflow), edit_prompt (the assembled prompt), pose (the POSE object), source_pose and preview_pose (preview images), caption, and caption_backend (tells you whether you got real Florence-2 output or the heuristic fallback).
Installing
Same pack as the rest:
cd ComfyUI/custom_nodes
git clone https://github.com/Spit8/_ComfyUI_CharacterPose
pip install -r _ComfyUI_CharacterPose/requirements.txt
Then load the example workflow workflows/pose_transfer_flux_klein.json, and drop the Klein models in place: flux-2-klein-4b-fp8.safetensors in models/diffusion_models/, qwen_3_4b.safetensors in models/text_encoders/, flux2-vae.safetensors in models/vae/. For the caption side, install transformers (Florence-2 weights download on first run). Restart ComfyUI; the node is under CharacterPose/Pose.
Gotchas
- Klein has no OpenPose ControlNet. If you need a hard pose lock, this fast path won't do it - that's what the Qwen-Image-Edit + ControlNet Union workflow is for. Prep is soft guidance: ref2 shows the model where limbs go.
- Bones in the output? The anti-skeleton wording is already in the prompt. Change the seed - that's the README's own advice.
- Side-view bias is real. A ¾ sprite becomes a ¾ pose, not a true front view; generative models approximate the rest. Qwen-Edit 2511 handles it better, but don't expect miracles.
- Check
caption_backend. If it saysfallback_heuristic, installtransformersfor actually usable captions.
One node, whole pipeline, ~4 steps. It's the reason to care about this pack at all.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| 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 |
| prop | COMBO | none | 6 options: none, sword, shield, staff, bow, horse |
| align_to_source | BOOLEAN | true | — |
| auto_caption | BOOLEAN | true | — |
| pose_keypointopt | POSE_KEYPOINT | — | |
| dwpose_imageopt | IMAGE | — | |
| prop2opt | COMBO | none | 6 options: none, sword, shield, staff, bow, horse |
| yawopt | FLOAT | 0-180–180 | — |
| pitchopt | FLOAT | 0-60–60 | — |
| rollopt | FLOAT | 0-30–30 | — |
| use_manual_cameraopt | BOOLEAN | false | — |
| caption_overrideopt | STRING | — | |
| extra_promptopt | STRING | — | |
| source_poseopt | POSE | — | |
| widthopt | INT | 00–4096 | — |
| heightopt | INT | 00–4096 | — |
| pose_promptopt | STRING | — | |
| llm_base_urlopt | STRING | https://api.openai.com/v1 | — |
| llm_modelopt | STRING | gpt-4o-mini | — |
| llm_api_keyopt | STRING | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| guide | IMAGE | — |
| edit_prompt | STRING | — |
| pose | POSE | — |
| source_pose | IMAGE | — |
| preview_pose | IMAGE | — |
| caption | STRING | — |
| caption_backend | STRING | — |