Slimy_HMR2_VNCCS
HMR2 keypoints into VNCCS PoseStudio
- VNCCS_POSE
- debug_json
Pose control in ComfyUI usually means one thing: an OpenPose or DWPose skeleton image feeding a ControlNet. This node is not that. Slimy_HMR2_VNCCS takes the 3D keypoints that HMR2 extracts from a photo and converts them into bone rotations - real Euler angles for a rigged mannequin - formatted as a Pose JSON file that VNCCS PoseStudio can load. A photo of a person standing on one leg in, and a poseable 3D mannequin matching it out.
It's a niche bridge between two tools nobody else was connecting. If you've never touched PoseStudio, stop reading now - this node is useless without it. If you have, this is the missing piece that gets real-world poses in without hand-poking every joint.
What it's actually for
PoseStudio's whole game is turning 3D mannequin poses into pose-conditioned generation - you pose the rig, render a depth/pose map, and feed that to a depth ControlNet or Qwen-Edit workflow. The manual way to get a pose in is dragging joints yourself; the clever way is pulling it from a reference photo. That's what this node does, at the output end of the pipeline: it pairs with the companion Slimy_HMR2_keyPoint3D node (separate repo, same author), which detects the person and runs HMR2 to estimate 3D joint positions. This node then does the retargeting math.
Slimy-Comfy isn't a random fork-farm either - they're the author of the PoseStudio fork the current release builds on, per the tool's own credits. This node is them dogfooding their own ecosystem.
How it works
The conversion runs in two stages, all plain Python plus numpy - no models, no API, no key. First fit_kp_to_mannequin() normalizes the raw HMR2 keypoints into mannequin space: SMPL has Y pointing down and HMR2's Z is unreliable, so it flips axes, scales the body to the mannequin's 1.5m reference height, and shifts the pelvis into A-pose. Then convert_fitted_to_pose() solves local bone rotations with forward kinematics - for each bone, find the shortest quaternion rotation that points the A-pose direction at the fitted keypoint, then express it relative to the parent bone. The pelvis rotation comes from the hip triangle's winding order (no gravity assumption, which keeps sideways poses honest), and the head gets its own face-based solve with a couple of calibration constants.
This is FK, not IK, and the author is upfront about the cost: big knee bends lose accuracy, the clavicles are interpolated (SMPL has no clavicle keypoint), and per-bone twist is left unresolved for downstream IK correction. For natural standing and walking poses it's genuinely good; for contortionist shots you'll be hand-fixing joints in PoseStudio anyway.
Inputs and outputs
One input, one job:
keypoints_json- a string (forced input) wired straight from the companion Slimy_HMR2_keyPoint3D node'skeypoints_jsonoutput.
Two outputs:
VNCCS_POSE- the clean Pose JSON: abonesdict of Euler angles (degrees, Three.js XYZ order) for pelvis, spine_03, neck_01, head, and all four limb segments, plusmodelRotationfor camera orientation.debug_json- the same pose with the fitted keypoint coordinates (debug_kp_fitted) included, so you can see what the stick figure looked like before rotation solving.
The node has a custom web UI: after a run you get a preview of the fitted keypoints and the resulting JSON on-screen, with an Export VNCCS PoseData button that downloads the file (named debug_*.json, though it's the clean pose - harmless quirk). Load that file into PoseStudio and you're posing.
Installing it
Two installs, not one. This node alone does nothing.
cd ComfyUI/custom_nodes
git clone https://github.com/Slimy-Comfy/Slimy_HMR2_VNCCS
git clone https://github.com/Slimy-Comfy/Slimy_HMR2_keyPoint3D
Or find both via ComfyUI Manager (search "Slimy_HMR2_VNCCS"), then restart ComfyUI. This pack ships no requirements.txt and needs only numpy, which ComfyUI already has - the pain is all in the companion: on its first run it auto-downloads roughly 2.5 GB of models, and the README warns you also have to fetch model data from a specific site manually. Read that repo's instructions carefully; it's the part that trips everyone up. Once loaded, inference runs in about six seconds.
Troubleshooting
- "keypoints_3d not found" / JSON parse errors - the input isn't coming from the companion node's
keypoints_jsonoutput. Wire it up properly; feeding it arbitrary JSON won't work. - Model download stalls or the "specific site" step is missed - the companion can't produce keypoints without its weights. This is the #1 setup failure, and it's a download problem, not a code problem.
- Weird head tilt or neck lean - the two calibration constants (
HEAD_PIVOT_OFFSET,HEAD_X_OFFSET) live at the top ofhmr2_to_pose.py. They're not node inputs; edit them in code if you want a systematic correction. - Poses look off after you swap mannequins - the
MANNEQUIN_APOSEtable is measured for the default rig; outdated values mean wrong rotations.
For bone-length tweaks, IK, or twist, PoseStudio's own tools are the right layer - this node just gets you a faithful starting pose from a real photo.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| keypoints_json | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| VNCCS_POSE | STRING | — |
| debug_json | STRING | — |