3D Pose Editor
Pose a real VRM model in 3D and pipe it into img2img
- background_image
- image
If your posing workflow is "load a reference image, drag a stick figure, and pray," this node is a different category of tool. PoseEditor3D (displayed as "3D Pose Editor") drops a real Three.js scene right inside your ComfyUI graph. You load a VRM, GLB, or GLTF character, grab its bones with the mouse, pose it in actual 3D, and hit capture - out comes a clean PNG you can feed straight into an image edit model or ControlNet.
It's built for the VRoid Studio / anime-character crowd, but it works with any skeleton-based GLB or GLTF. Where the classic 2D OpenPose editors give you a flat skeleton to approximate with, this one lets you rotate a hip, twist a wrist, and look at the result from any camera angle before you commit. If you've ever generated a pose you thought was right and discovered the hand was backwards, you'll get why that's worth a custom node.
How it works
The heavy lifting happens in the browser, not on the Python side. The pack bundles Three.js and @pixiv/three-vrm (v2.1.0) locally in js/vendor/, and a frontend extension injects a WebGL canvas plus a row of buttons into the node. Drag the blue control points on a bone - left/right drags rotate on Y, up/down on X, Alt+up/down on Z. Adjust the camera, flip between orthographic and perspective, tune lights in the built-in Light Editor, even slide shape keys for expressions.
When you hit 📸 Capture, the JS canvas is turned into a base64 PNG and stuffed into a hidden image_data widget. The Python node (PoseEditor3DNode) then decodes it, composites it over an optional background, resizes it, and hands back a standard torch IMAGE tensor. No API, no key, no server-side model - it all runs on your machine.
The inputs and output that matter
The one input you'll never touch by hand is image_data - it's a string the frontend fills on capture. The ones you'll actually set:
- output_size_mode -
Standard(use the captured size),Background(match your background image), orCustom(usecustom_width/custom_height, 64–4096, step 8). Custom mode even draws a live letterbox overlay so you see the crop before you capture. - timer_interval - seconds between auto-captures when you toggle the ⏱ timer button (1–3600, default 5). Handy for baking a slow rotation into a series of frames.
- background_image (optional IMAGE) - composited behind the pose on the Python side. Wire a scene render in and get a finished image out.
The single image output goes anywhere an IMAGE goes: into Qwen-Image-Edit or another edit model for reposing a character, into a ControlNet for conditioning, or straight to a preview node as a pose reference.
Installing it
Via ComfyUI Manager: open Install Custom Nodes, search comfyui-vrm-pose-editor, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/ketle-man/comfyui-vrm-pose-editor
Then restart ComfyUI and look under the 3D Pose category. Nice change of pace: there's no requirements.txt, no extra pip packages, and no model downloads - everything the editor needs ships in the repo. This is the rare custom node that installs clean and just works.
Where people get tripped up
- Models load from your browser, not the server. The VRM button opens a local file picker in the browser tab. For a model to auto-load on startup, drop
model.glb/model.vrm/model.gltfinto the node'sjs/folder and restart. - Scroll wheel won't zoom on some mice/drivers. It's a known quirk. Open the Light Editor and toggle 🖱 Ctrl+Right drag zoom to switch from wheel zoom to Ctrl+Right-drag.
- VRoid / Blender models look too dark. Hit CC (color correction) - it enables sRGB + ACES Filmic tone mapping, and it usually fixes exactly this.
- Pose files save server-side, not in your browser:
poses/for poses (.jsonor.vroidpose- though VRoid finger presets aren't supported),.light_library/for light setups. Your saved workflow JSON will also carry the last captured pose as a base64 blob inimage_data, so shared workflow files get chunky. - Shadows only work on Directional lights - Spot/Point shadows clash with the VRM MToon shader. Use the ☀ sun light if you want shadows.
If you're reposing characters by trial and error, this is worth an afternoon. It's the difference between guessing a pose in 2D and knowing it in 3D.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image_data | STRING | — | |
| output_size_mode | COMBO | Standard | 3 options: Standard, Background, Custom |
| custom_width | INT | 60064–4096 | — |
| custom_height | INT | 60064–4096 | — |
| timer_interval | INT | 51–3600 | — |
| background_imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |