SCAIL Pose from DWPose
Turn a DWPose skeleton into a 3D SCAIL base pose your dancer can inherit
- dw_poses
- pose_keypoint
- SCAIL_POSE
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 (aDWPOSEStype, e.g. from the DWPose detection nodes in ComfyUI's controlnet/pose stack).pose_keypoint- an OpenPose-stylePOSE_KEYPOINTalternative, 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_idleskeleton 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.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image_width | INT | 51264–4096 | Width of source image that DWPose was run on |
| image_height | INT | 76864–4096 | Height of source image that DWPose was run on |
| depth | FLOAT | 800.00100–5000 | Assumed Z-depth for 2D to 3D conversion |
| fov | FLOAT | 55.0010–120 | Field of view for projection. Match your render FOV. |
| dw_posesopt | DWPOSES | DWPose output (preferred format) | |
| pose_keypointopt | POSE_KEYPOINT | Alternative OpenPose-style keypoint input |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SCAIL_POSE | SCAIL_POSE | — |