Nodes/ComfyUI-SCAIL-AudioReactive/SCAIL Pose from DWPose
ComfyUI Node

SCAIL Pose from DWPose

Turn a DWPose skeleton into a 3D SCAIL base pose your dancer can inherit

By ckinpdx·Created 9 months ago·Updated 8 months ago· 17
SCAIL Pose from DWPose
  • dw_poses
  • pose_keypoint
  • SCAIL_POSE
image_width512
image_height768
depth800.00
fov55.00

The pack's dance nodes work in 3D world space, but your reference image is 2D pixels. SCAILPoseFromDWPose is the bridge: it takes a DWPose (or OpenPose-style) skeleton from an image and projects it into the 3D space the choreographer and renderer expect. This is the node you reach for when your dancer needs to be a specific character - same proportions, same stance - rather than a procedural skeleton from SCAILBasePoseGenerator.

The inputs that matter

Two optional pose inputs, one of which you'll use:

  • dw_poses - DWPose output, the preferred format (a DWPOSES type, e.g. from the DWPose detection nodes in ComfyUI's controlnet/pose stack).
  • pose_keypoint - an OpenPose-style POSE_KEYPOINT alternative, if your detector produces that format.

The other four inputs describe the geometry of the conversion:

  • image_width / image_height - the dimensions of the image DWPose was run on. The node needs these to un-project 2D keypoints into 3D.
  • depth - assumed Z-depth for the 2D→3D conversion (800 default).
  • fov - field of view in degrees, and the tooltip says it plainly: match your render FOV. If the base pose and the renderer disagree on FOV, the skeleton will sit at the wrong apparent size.

How it works

The node reads the detected 18 keypoints, normalizes them, and un-projects each into 3D using the focal length derived from fov and the image size: (x - cx) * depth / focal, etc. It interpolates any missing joints by inheriting from their parent. Two things worth knowing:

  • It detects everyone in the image - it does not clone anyone. The README is blunt about this: to animate 3 people, your reference image needs 3 people, and your upstream detector needs to find all of them. This is the single biggest source of "why is my band a soloist" confusion.
  • If nothing is detected, it falls back to a default active_idle skeleton from the base generator rather than erroring out - useful to know when the output looks suspiciously generic.

The multi-character detection has real requirements on the upstream side. The README recommends running your DWPose/OpenPose detector at 1024 or higher for group shots, using dw-ll_ucoco.onnx (not the 384 variant) for the pose model, yolo_nas_l_fp16.onnx or yolox_x.onnx for the bounding-box detector (stock yolox_l misses people in complex poses and back rows), and max_people > 1 if your detector exposes it.

Output and install

Output is a single SCAIL_POSE (the tooltip-less output is just named SCAIL_POSE), feeding SCAILBeatDrivenPose's base_pose or the scail_pose reference inputs on the CMU/FBX nodes. Install is the pack's shared routine: clone ckinpdx/ComfyUI-SCAIL-AudioReactive into ComfyUI/custom_nodes, pip install -r requirements.txt, restart, or use ComfyUI Manager. No downloads of its own - it just reshapes what the detector already gave you.

CategorySCAIL-AudioReactive

Inputs (6)

NameTypeDefaultDescription
image_widthINT51264–4096Width of source image that DWPose was run on
image_heightINT76864–4096Height of source image that DWPose was run on
depthFLOAT800.00100–5000Assumed Z-depth for 2D to 3D conversion
fovFLOAT55.0010–120Field of view for projection. Match your render FOV.
dw_posesoptDWPOSESDWPose output (preferred format)
pose_keypointoptPOSE_KEYPOINTAlternative OpenPose-style keypoint input

Outputs (1)

NameTypeDescription
SCAIL_POSESCAIL_POSE