ComfyUI Node

3D Pose Editor

Pose a real VRM model in 3D and pipe it into img2img

By ketle-man·Created 5 months ago·Updated 6 days ago· 11
3D Pose Editor
  • background_image
  • image
image_data
output_size_modeStandard
custom_width600
custom_height600
timer_interval5

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), or Custom (use custom_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.gltf into the node's js/ 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 (.json or .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 in image_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.

Category3D Pose

Inputs (6)

NameTypeDefaultDescription
image_dataSTRING
output_size_modeCOMBOStandard3 options: Standard, Background, Custom
custom_widthINT60064–4096
custom_heightINT60064–4096
timer_intervalINT51–3600
background_imageoptIMAGE

Outputs (1)

NameTypeDescription
imageIMAGE