Draw NLF Poses
Render NLF pose predictions into a control image
- poses
- image
This is the node that turns NLF's 3D pose predictions into an actual image - a drawn skeleton you can look at and, more importantly, feed into a pose-driven Wan generation. NLF (Neural Localizer Fields) estimates 3D human pose from a driving video; DrawNLFPoses renders those predictions as keypoint/stick-figure images, frame by frame. It's the last step of the "extract poses from footage" pipeline before those poses drive your character.
If you've used DWPose or OpenPose preprocessors, this is the same idea - a rendered skeleton as a control signal - just sourced from NLF's richer 3D estimate. The rendered images become the pose sequence for something like UniAnimate, VACE, or SCAIL-2 motion transfer.
How it works
You hand it the NLF pose predictions (produced by running the loaded NLF model on your driving images) plus a canvas size, and it draws each pose onto a blank image of that size - joints as points, bones as sticks. The result is an IMAGE (a batch, one per predicted frame) suitable as a pose-control input downstream. A couple of style knobs control the look of the drawn skeleton, which matters because different pose-consuming models expect their control images to look a certain way.
The inputs that matter
poses(NLFPRED, required) - the 3D pose predictions from the NLF prediction step. This is the data you're visualizing.width/height(default 512 × 512) - the canvas size. Set these to match the resolution you'll generate at, so the pose control lines up with your output frame.style(original/scail, optional) - how the skeleton is drawn. Pickscailif you're feeding SCAIL-2 motion transfer, which expects its pose images in a particular style;originalis the default look otherwise. Matching the style to the consumer matters more than it looks.stick_width/point_radius(optional) - thickness of the drawn bones and size of the joint dots. Cosmetic, but a control model can be sensitive to line weight, so tweak if the pose isn't reading cleanly.
The output is image (IMAGE) - the drawn pose sequence, wired into your pose-control input.
How to install it
ComfyUI Manager: search ComfyUI-WanVideoWrapper, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/kijai/ComfyUI-WanVideoWrapper
pip install -r ComfyUI-WanVideoWrapper/requirements.txt
then restart. This node draws - it downloads nothing - but it needs NLFPRED input, which means you need the NLF model loaded (LoadNLFModel) and a prediction step ahead of it.
Common issues & troubleshooting
Poses don't line up with the generated character. Match width/height to your generation resolution. If the skeleton was drawn on a 512×512 canvas but you generate at 832×480, the pose lands off. Keep the canvas and the output the same aspect and size.
The downstream model ignores the pose. Check style. Feeding SCAIL-2 an original-style skeleton (or vice versa) can make the control model misread or ignore it - the two styles exist because different consumers want different drawings. Set it to match what you're driving.
Skeleton looks noisy or jittery frame to frame. That usually traces back upstream to the NLF prediction quality on your driving footage, not to the draw step. Cleaner, higher-res, well-lit driving video gives steadier poses. stick_width/point_radius only change how it's drawn, not how stable the underlying estimate is.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| poses | NLFPRED | Input poses for the model | |
| width | INT | 512 | — |
| height | INT | 512 | — |
| stick_widthopt | FLOAT | 4.000–1000 | Stick width multiplier |
| point_radiusopt | INT | 51–10 | Point radius for drawing the pose |
| styleopt | COMBO | original | style of the pose drawing |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |