Nodes/ComfyUI-CustomNodeKit/Draw SDPose Keypoints (V2)
ComfyUI Node

Draw SDPose Keypoints (V2)

Turn pose data into the stick figure your video model actually wants

By user2318·Created 4 months ago·Updated about a month ago· 56
Draw SDPose Keypoints (V2)
  • keypoints
  • IMAGE
draw_bodytrue
draw_handstrue
draw_facetrue
draw_feetfalse
stick_width4
face_point_size3
hand_point_size4
score_threshold0.30
max_frames2500
mouth_modedraw_all
enable_yaw_thicknessfalse
yaw_thickness_min1
foot_modedots
color_schemev4_custom
yaw_angles
hand_scale1.00

Pose detection gives you numbers - keypoint coordinates, confidence scores, people lists. Video models like WanAnimate don't want numbers, they want a picture of the skeleton. Draw SDPose Keypoints (V2) is the pack's renderer: it takes a POSE_KEYPOINT sequence and draws the classic whole-body stick figure - body, hands, face, and optionally feet - frame by frame, out as an IMAGE batch you can feed directly into WanAnimate's pose_video input or save as the pose video itself.

It's the V2 because it layers in the stuff that makes a stick figure readable to a model instead of just technically correct. The headline features:

  • Layered drawing with occlusion: it draws front-side and back-side bones in the right order so limbs cross believably instead of z-fighting.
  • Yaw-aware thickness (enable_yaw_thickness): when you feed in a yaw_angles sequence (from the pack's Estimate Yaw nodes), bones get thinner as the subject turns sideways and thicker facing the camera - matching how the model perceives a 3D body in 2D. Without yaw input it just draws at a fixed stick_width.
  • Two foot modes (foot_mode): dots (three colored dots at the ankle/toe points) or line (an ankle-to-toe bone line). The line mode was added for clearer foot orientation in dance/motion work.

What you set

  • keypoints - the pose sequence (required).
  • draw_body / draw_hands / draw_face / draw_feet - which parts to draw. Feet default off; turn them on for dance.
  • stick_width (4), face_point_size (3), hand_point_size (4) - visual weight dials.
  • score_threshold (0.3) - drop keypoints below this confidence; raise it to clean up jittery detections.
  • max_frames (2500) - safety cap; longer inputs get truncated with a warning.
  • mouth_mode - draw_all, no_draw, or inner_lip_only. The "inner lip" option hides the outer lip line, which some models read more cleanly.
  • color_scheme - v4_custom (default), standard (classic OpenPose rainbow), or monochrome.
  • yaw_angles (optional) - drives thickness and occlusion ordering.
  • hand_scale (optional) - scales hand bones outward from the wrist (for exaggerated hand clarity) without shifting the wrist.

Output is a single IMAGE batch - black background, colored bones, ready for WanAnimateToVideoCustom's pose_video.

Install

Part of user2318/ComfyUI-CustomNodeKit. ComfyUI Manager: search "CustomNodeKit". Or:

cd ComfyUI/custom_nodes
git clone https://github.com/user2318/ComfyUI-CustomNodeKit.git
cd ComfyUI-CustomNodeKit
pip install -r requirements.txt

then restart. It draws with numpy - no extra models. The POSE_KEYPOINT input comes from the SDPose ecosystem (the official sdpose-ood pack), which does need its own pose models.

The gotcha

The canvas size comes from the keypoints' canvas_height/canvas_width, and the whole sequence is drawn on that one canvas. If your segments have inconsistent canvases (see the resize/concat notes in this pack), the output silently inherits the first frame's size and later frames can be clipped. And don't expect this to fix bad input: score_threshold only hides low-confidence keypoints, it doesn't invent missing ones - a subject with a dropped arm will render a skeleton with no arm, and WanAnimate will happily animate it that way. If you get clean poses in the preview but janky animation, the answer is usually upstream (better detection, fix_empty_frames, a higher threshold), not more draw settings.

CategorySDPose

Inputs (17)

NameTypeDefaultDescription
keypointsPOSE_KEYPOINT
draw_bodyBOOLEANtrue
draw_handsBOOLEANtrue
draw_faceBOOLEANtrue
draw_feetBOOLEANfalse
stick_widthINT41–20
face_point_sizeINT31–20
hand_point_sizeINT41–20
score_thresholdFLOAT0.300–1
max_framesINT25001–5000
mouth_modeCOMBOdraw_all3 options: draw_all, no_draw, inner_lip_only
enable_yaw_thicknessBOOLEANfalse开启后根据偏航角动态调整骨骼粗细:正面(0°/±180°)最粗,侧面(±90°)最细。When enabled, dynamically adjusts bone thickness based on yaw angle: front (0°/±180°) thickest, side (±90°) thinnest.
yaw_thickness_minINT11–20侧面(±90°)时的最细粗细,自动受 stick_width 约束(不会高于 stick_width)。Minimum thickness at side view (±90°), automatically constrained by stick_width (won't exceed stick_width).
foot_modeCOMBOdots脚部绘制模式:dots=三个彩色圆点(原有行为),line=从踝关节到脚尖画一条骨骼线。Foot drawing mode: dots=three colored dots (original behavior), line=draw a bone line from ankle to toe.
color_schemeCOMBOv4_custom骨骼配色方案:v4_custom=自定义V4方案(默认), standard=标准OpenPose彩虹配色, monochrome=统一灰色。Color scheme: v4_custom=custom V4 (default), standard=standard OpenPose rainbow, monochrome=uniform gray.
yaw_anglesoptFLOAT来自 SDPoseEstimateYawSimple/Advanced 的 yaw_array,用于动态调整骨骼粗细和遮挡顺序。Yaw array from SDPoseEstimateYawSimple/Advanced, used for dynamic bone thickness and occlusion ordering.
hand_scaleoptFLOAT1.000.1–10手部骨骼缩放比例,1.0=原始大小。对手部骨骼(从手腕向外)进行缩放,手腕位置保持不动避免错位。Hand bone scale ratio, 1.0=original size. Scales hand bones from wrist outward while keeping wrist position fixed.

Outputs (1)

NameTypeDescription
IMAGEIMAGE