ComfyUI Node

SMPL-X Editor

Drag a body into shape, then render ControlNet maps straight from your view

By ameliacode·Created 5 months ago·Updated 2 months ago· 5
SMPL-X Editor
  • smplx
  • mesh_data
  • pose
  • depth
  • normal
  • canny
size512
reik_iters80
device
seed0
corrections
camera
betas
expression

SMPL-X Editor is the node that turns this pack from "estimator" into "pipeline." The estimators hand you an SMPL-X body, but estimation is rarely the final word - you want to pose it, shape it, and feed it onward. This node is an interactive 3D viewport right in your ComfyUI canvas. Drag joints, tweak shape, orbit the camera, and out the other side come mesh data plus four rendered control maps taken from your viewpoint. That last part is the party trick: the pose/depth/normal/canny outputs render from wherever you've orbited the camera, so you're not locked to a fixed front view.

If you've seen the ControlNet pose, depth, normal, and canny conditions floating around workflows, this is where those get made - except instead of OpenPose-style 2D skeletons, you're conditioning on an actual posed mesh. A pose/depth/normal/canny quad from a 3D body is a much stronger spatial guide than a flat skeleton, and because you can edit the pose first, you can generate a character in a pose the source photo never had.

How it works

  • Drag joints to re-pose. Body joints (0–21) and finger joints (25–54) get draggable handles in the viewer. Dragging one re-solves the pose with IK - everything else stays frozen, so edits stay local. reik_iters (default 80) controls how many IK iterations the re-solve gets; raise it if a dragged joint isn't landing where you put it.
  • Shape and expression, typed in. betas takes up to 10 comma-separated values (range roughly −5 to 5; beta0 ≈ overall size), expression up to 10 coefficients. Empty means "keep what the estimator fitted."
  • The camera is a parameter. As you orbit, the camera string updates automatically and the maps render from that exact viewpoint. Empty = front view. This is genuinely useful for generating a character at a three-quarter angle.
  • No PyTorch3D, no CUDA build tools. The renderer is pure NumPy/OpenCV, which is a big part of why this pack installs cleanly. The 3D viewer is a JS overlay (based on comfy-3d-viewers).

Inputs and outputs

Required: smplx (from any estimator), size (render resolution, default 512, up to 2048), reik_iters, device, seed. Optional: corrections (auto-filled by drags - you'll rarely touch it), camera, betas, expression.

Outputs: mesh_data (wire into Export Mesh), plus pose, depth, normal, canny images - each ControlNet-ready.

Installing and running

Pack install as always - ComfyUI Manager, search SMPLx Estimator, install, restart - or the manual clone + pip install -r requirements.txt + python install.py route. You need a working estimator path first (the quick start is the Multi-HMR example workflow in example_workflows/), plus the registration-walled SMPL-X file behind it all.

Common issues

  • Edits don't stick. Make sure you've actually orbited/gripped in the viewer (which updates corrections and camera) before the node re-runs, and that those strings aren't being cleared by a stale graph state.
  • Maps look wrong. Check size - 512 is the default and fine for ControlNet; 2048 is for when you want cleaner geometry exports.
  • Over-posing fingers. The finger IK exists and is great, but it's per-joint and slow in bulk. For a full fist, it's usually easier to edit in the estimator's output than to drag all 30 finger joints.

This is the node people mean when they say the pack is "SMPL-X estimation with an editor." Estimators get you 80% of the way; this gets you the rest, and hands you the ControlNet maps for the trip.

CategorySMPLx Estimator

Inputs (9)

NameTypeDefaultDescription
smplxSMPLX
sizeINT512256–2048
reik_itersINT802–400
deviceCOMBO3 options: auto, cuda, cpu
seedINT00–2147483647
correctionsoptSTRING
cameraoptSTRINGEditor camera (set automatically as you orbit the 3D view). Renders the output maps from that viewpoint; empty = front view.
betasoptSTRINGBody shape: up to 10 comma-separated betas (e.g. '1.5,-0.5'). Empty = keep fitted shape. Range ~[-5,5]; beta0≈overall size.
expressionoptSTRINGFacial expression: up to 10 comma-separated coefficients. Empty = neutral.

Outputs (5)

NameTypeDescription
mesh_dataMESH_DATA
poseIMAGE
depthIMAGE
normalIMAGE
cannyIMAGE