SMPL-X Editor
Drag a body into shape, then render ControlNet maps straight from your view
- smplx
- mesh_data
- pose
- depth
- normal
- canny
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.
betastakes up to 10 comma-separated values (range roughly −5 to 5;beta0≈ overall size),expressionup to 10 coefficients. Empty means "keep what the estimator fitted." - The camera is a parameter. As you orbit, the
camerastring 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
correctionsandcamera) 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.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| smplx | SMPLX | — | |
| size | INT | 512256–2048 | — |
| reik_iters | INT | 802–400 | — |
| device | COMBO | 3 options: auto, cuda, cpu | |
| seed | INT | 00–2147483647 | — |
| correctionsopt | STRING | — | |
| cameraopt | STRING | Editor camera (set automatically as you orbit the 3D view). Renders the output maps from that viewpoint; empty = front view. | |
| betasopt | STRING | Body shape: up to 10 comma-separated betas (e.g. '1.5,-0.5'). Empty = keep fitted shape. Range ~[-5,5]; beta0≈overall size. | |
| expressionopt | STRING | Facial expression: up to 10 comma-separated coefficients. Empty = neutral. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| mesh_data | MESH_DATA | — |
| pose | IMAGE | — |
| depth | IMAGE | — |
| normal | IMAGE | — |
| canny | IMAGE | — |