Mesh2Motion Explore
A whole 3D animation studio, stuffed inside one ComfyUI node
- image
- video
Want a dolly-in on a walking character, an explosion, a handheld look-around - rendered deterministically, exactly once, at whatever resolution you set? Prompting a video model to give you that is a coin flip. Mesh2Motion Explore just renders it. It embeds a heavily modified fork of Mesh2Motion - a real browser-based rigging and animation tool - directly in the node, and hands the result to your graph as an IMAGE and a VIDEO.
That's the pitch: camera moves and character animation become reproducible inputs to the rest of your workflow instead of something you hope the model nails.
Why you'd reach for it
This node sits at the front of video and character-consistency workflows. The community's standard answer to "I need this pose and this shot" has become "control it, don't hope for it" - and that's exactly what this does. Feed the rendered VIDEO or the first frame into a video model like Wan, LTX, or Hunyuan as a camera reference, or grab a frame and route it into a pose/depth ControlNet to pin a character's body. Because the output is a real rendered shot, it's the same every run.
The author, jtydhr88, also built ComfyUI's native 3D nodes (Load3D, Preview3D, SaveGLB), so this slots into that ecosystem naturally - right-click a Load3D node and the editor opens with your model pre-loaded. There's a custom FBX import too, if the built-in characters aren't enough.
How it works
No external API, no key, everything local. The pack serves a prebuilt copy of the Mesh2Motion web app through ComfyUI's own HTTP server and renders it in an iframe inside the node. You pick a rig (Human, Fox, Bird, Dragon, plus primitives), an animation, and one of 116 camera presets across 8 categories - basic moves, cinematic, handheld, speed ramps, locomotion, vehicle, action, abstract.
For video, the editor records frame-by-frame from the WebGL backing buffer using the WebCodecs VideoEncoder, which is deterministic and fast, then decodes the webm server-side with PyAV into a VIDEO tensor. Everything you pick - skeleton, preset, per-preset tuning, timeline state - persists in node.properties, so reloading the workflow restores the exact shot.
The widgets you actually touch
Seven widgets, four of which you can mostly ignore. The booleans:
preview_output- overlays the crop rectangle matching your width/height. Turn it on; it's how you verify what will actually be captured.checker_room- wraps the scene in a checkered room for "more AI-friendly" rendering. Handy when downstream models need clean depth structure.show_skeleton- draws the bone helper over the mesh.mirror_animations- mirrors the animation across the rig's symmetry plane.
Then width / height (default 1024) set resolution for both outputs, and fps (24) sets the encoded frame rate of the video. The optional image and video_frames inputs are hidden, socketless strings the frontend fills in - internal plumbing, leave them alone.
Outputs: image (IMAGE) always fires with a screenshot at the playhead, and video (VIDEO) carries the rendered camera move. If no camera preset is active you still get a video output - just a black single frame, so downstream nodes never choke.
Installing it
The easiest install in this ecosystem, honestly. ComfyUI Manager → search "Mesh2Motion", or:
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyUI-mesh2motion
Restart ComfyUI. No extra Python dependencies, no model downloads - rigs, animations, and the preset pack all ship inside the repo (PyAV is already a ComfyUI core dependency). One catch: it's built on the newer native-node API (comfy_api.latest, VIDEO output type), so it wants a recent ComfyUI core. Import errors around comfy_api or a missing VIDEO type mean update ComfyUI first.
Where people get burned
Slow video recording. That's the MediaRecorder fallback kicking in - WebCodecs needs a secure context and a browser that has it (Safari 17+, Firefox 130+). Localhost and 127.0.0.1 are secure contexts; http://192.168.x.x:8188 is not. Run on localhost or HTTPS and recording speeds right up.
No camera preset = black video. If you didn't pick one from the right-side Camera Presets panel, the VIDEO is a single black frame. Not a bug, but it sure looks like one.
Stale cached video. The capture is cached by input hash; re-queueing with unchanged inputs is instant. Older versions silently ignored tuning changes and returned stale webm (fixed in 1.1.0), but if your output ever looks identical after you changed a knob, bump any input to force a re-render.
Set your resolution, pick a preset, tune speed/FOV/path scale/yaw/roll in the right panel, and queue. The hard part - getting the shot you actually wanted - is the one thing this node takes off your plate.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| show_skeleton | BOOLEAN | false | — |
| mirror_animations | BOOLEAN | false | — |
| preview_output | BOOLEAN | false | — |
| checker_room | BOOLEAN | false | — |
| width | INT | 10241–4096 | — |
| height | INT | 10241–4096 | — |
| fps | INT | 241–120 | — |
| imageopt | STRING | — | |
| video_framesopt | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| video | VIDEO | — |