Draw Animal ViTPose
Turn pose data into the skeleton images Wan Animate actually consumes
- pose_data
- pose_images
Here's the thing about pose data: it's just numbers - keypoint coordinates in a dict. Wan Animate doesn't want numbers, it wants pictures of skeletons on a black background, the same way human Wan Animate workflows feed it DWPose-rendered images. Draw Animal ViTPose is the renderer that bridges the two. It takes the pose_data bundle from Animal Pose and Detection and draws the 17-keypoint AP10k/APT36k skeleton onto a canvas sized for your generation. One node, one output, and it's the last preprocessing step before your sampler.
The rendering itself is straightforward: a black canvas, colored sticks connecting the animal's joints (shoulder→elbow→front paw, hip→knee→back paw, plus the head keypoints for eyes and nose). If the pose was retargeted onto a reference animal, the node handles keeping the skeleton consistently framed across the whole batch - which matters more than it sounds, because a skeleton that drifts in scale between frames makes the generated video wobble.
The inputs you'll actually set
- pose_data - from Animal Pose and Detection. Nothing else feeds it.
- width / height - canvas size, default 832×480. Match your Wan Animate generation resolution, same as you'd match ControlNet condition dimensions to the output.
- body_stick_width - stick thickness.
-1(default) means auto,0disables body drawing entirely. You'll rarely touch this unless your skeleton looks too thin or too chunky on screen. - draw_head - boolean, default on. Toggles the eye/nose keypoints. Head keypoints can add useful fidelity for facial expression transfer, and they can also add noise if the pose detector is jittery on a small head.
- retarget_padding - default 16. This only matters in retarget workflows: when you're transferring a template pose onto a reference animal image, the node pads the retargeted skeleton and resizes it to the target canvas so the animal doesn't blow up or shrink between frames. Set it to
0to disable and just fit each frame.
The output
pose_images - an IMAGE batch of rendered skeleton frames, one per input frame, on black. That's it. Feed it into your Wan Animate / Wan 2.2 Animate sampler's pose input and generate.
Install and the usual caveats
cd ComfyUI/custom_nodes
git clone https://github.com/Code2Collapse/ComfyUI-WanAnimalPreprocess.git
pip install -r requirements.txt
Or just search "ComfyUI-WanAnimalPreprocess" in ComfyUI Manager. No extra models live here - everything this node needs comes through pose_data.
Two things trip people up. First, dimension mismatch: your skeleton canvas must match the sampler's generation size, or the pose conditioning will be misaligned and you'll get a video that half-ignores the pose. Second, this is where a bad detection pass shows up - the node faithfully renders whatever keypoints it's given, so if the upstream detection was jittery, your skeletons are jittery, and no amount of renderer settings fixes that. If you see skeletons jumping between frames, go back to Animal Pose and Detection and check the bboxes, not here.
One genuinely nice touch: the renderer always draws on a black background in the Wan convention, so the output drops straight into the sampler without any background-flattening step you'd need with a human OpenPose renderer.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_data | POSEDATA | From Animal Pose and Detection. | |
| width | INT | 83264–2048 | Width of the generation |
| height | INT | 48064–2048 | Height of the generation |
| retarget_padding | INT | 160–512 | When > 0, the retargeted pose image is padded and resized to the target size |
| body_stick_width | INT | -1-1–20 | Width of the body sticks. Set to 0 to disable body drawing, -1 for auto |
| draw_head | BOOLEAN | true | Whether to draw head keypoints (eyes, nose) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pose_images | IMAGE | Rendered animal-skeleton IMAGE batch. Feed into Wan-Animate sampler. |