Nodes/AnimoFlow/SMPL → OpenPose 3D (AnimoFlow)
ComfyUI Node

SMPL → OpenPose 3D (AnimoFlow)

Turning generated motion into a pose-conditioning video

By AnimoFlow·Created 2 months ago·Updated about a month ago· 1
SMPL → OpenPose 3D (AnimoFlow)
  • npz_b64
  • pose3d_b64
face_scale1.00

Here's a genuinely fun thing you can do with generated motion: feed it to a video model as pose conditioning, so the video model animates a real character doing exactly the motion you generated. That's the branch of this pack these "Video" nodes exist for, and AnimoFlow_SmplToOpenPose3D is its first stage: it converts the raw NPZ pose data into 3D OpenPose keypoints - the BODY_18 joint layout that pose-conditioned video models and ControlNet pipelines expect.

The catch that makes this node more than a format conversion: your generated motion has no face or hand keypoints, and it doesn't know about OpenPose's conventions at all. So the node synthesizes what's missing. It maps the 22-joint SMPL skeleton onto OpenPose's BODY_18 layout, and - the clever bit - synthesizes nose, eye, and ear keypoints from the head position and the character's facing direction. A body without a face won't condition a video model that expects face keypoints, so this is what fills the gap. The single face_scale input (0.5–2, default 1) controls how far out those synthesized facial offsets sit, which matters because a face that's too small reads wrong in the conditioning and a face too big starts to overlap the body.

The pipeline it starts

AnimoFlow_Resample (npz_b64) → AnimoFlow_SmplToOpenPose3D (pose3d_b64) → AnimoFlow_Camera (camera_b64) → AnimoFlow_OpenPoseRender (images) → video model

The output is pose3d_b64 (ANIMOFLOW_POSE3D), which feeds AnimoFlow_Camera - the virtual camera that turns 3D keypoints into per-frame views. This whole chain is the "video control demo" branch of the pack: the README is explicit that it's a demo branch, deliberately not part of the product plan, but the text_kimodo_video workflow makes it fully self-contained, all the way to a Wan 2.2 Fun-Control generation.

What it isn't

Two things worth knowing so you don't reach for the wrong node. First, this is not DWPose or OpenPose detection - it doesn't look at a video and extract pose; it starts from already-generated 3D motion and renders it in a pose-detector's coordinate convention. The rendering convention is chosen to match what controlnet_aux/DWPose outputs look like, so downstream ControlNet models trained on real pose videos accept it without re-tuning. Second, use it on the raw pre-IK joints - the README specifically says the video chain starts from the raw NPZ straight out of resample, no retargeting, because IK/retargeting would bake in the character's proportions and the pose layout would no longer match BODY_18.

Using it

It's a native node - no container, no weights, runs in the ComfyUI process. Install is the standard nodes step (ComfyUI Manager, search "AnimoFlow", or git clone https://github.com/AnimoFlow/comfyui-animoflow.git into custom_nodes/). The generator feeding it does need the Docker backend, but this conversion itself is pure numpy. If the face keypoints look off in your final control video, the first lever is face_scale, not a re-generation.

CategoryAnimoFlow/Video

Inputs (2)

NameTypeDefaultDescription
npz_b64ANIMOFLOW_NPZ
face_scaleFLOAT1.000.5–2Scale of the synthesized nose/eye/ear offsets

Outputs (1)

NameTypeDescription
pose3d_b64ANIMOFLOW_POSE3D