Nodes/Comfy3D-Studio/Comfy3D-Studio
ComfyUI Node

Comfy3D-Studio

The ComfyUI node that puts a real 3D editor inside your graph

By Aero-Ex·Created 6 months ago·Updated 20 days ago· 1
Comfy3D-Studio
  • input_3d
  • IMAGE

Here's the thing nobody warns you about when you get into image-to-3D in ComfyUI: the mesh comes back from Hunyuan3D or TripoSR looking great in a thumbnail and there is no good way to actually look at it while it's in your graph. Comfy3D-Studio fixes that. It's a genuine Three.js 3D editor embedded in a node - orbit, select, brush, move, rotate, undo - and when the node runs, it snaps the viewport and hands you that image as a normal IMAGE output you can feed anywhere.

It's not a generator and it calls no API. It's the viewport that the rest of the 3D stack in ComfyUI is missing.

How it works

The node is a two-way bridge between Python and the browser. On the way in, the input_3d input (a wildcard, so it accepts almost anything) takes one of three things:

  • a path string to a mesh - absolute, or relative to your ComfyUI input/output/temp folders;
  • a {"mesh": ...} dict in the shape ComfyUI-3D-Pack outputs, which is handy if you run that pack alongside this one;
  • a raw trimesh object - the code exports it to a temp .glb for you automatically.

The node normalizes the path, tells the frontend where the mesh lives, and the embedded viewport loads it. You edit. When you run the node, the canvas is captured as a JPEG and piped back as the IMAGE result. If it executes with no snapshot available - headless, API-only, or a browser that hasn't sent one yet - you get a 512×512 black placeholder image, which is a thing to know rather than a bug.

Why you'd reach for it

The 3D generation story in ComfyUI is basically "impressive silhouette, triangle-soup topology underneath." The honest workflow is: generate the shape, inspect it from every angle, decide it's fine as a static prop, then render it into a 2D image you can actually refine. Comfy3D-Studio is that loop. The IMAGE output plugs straight into an img2img pass, an upscaler, or a Save Image node - you can re-prompt a specific viewport angle with any model you already run.

The other reason to like it: it does not drag in ComfyUI-3D-Pack. That pack is where most people lose an evening to compiled CUDA wheels. This one is its own lightweight MIT pack - no models to download, no native builds, just a browser viewport and a bit of Python. If all you want is to inspect and re-render a mesh, this is the low-drama route.

The only inputs and outputs that matter: input_3d (optional) in, IMAGE out. That's the whole schema.

Installing it

ComfyUI Manager - search Comfy3D-Studio - or:

cd ComfyUI/custom_nodes
git clone https://github.com/Aero-Ex/Comfy3D-Studio

Restart ComfyUI. Python 3.10+, MIT licensed, zero model files. The one real dependency, trimesh, is only needed by the sibling Texture Splitter node and is imported lazily - if a node throws ModuleNotFoundError: trimesh, run pip install trimesh in your ComfyUI environment.

Where people get burned

  • Confusing it with ComfyUI-3D-Pack. Different author, different beast. Old forum threads about "Comfy3D" mean that other, install-fragile pack. This is the lightweight one.
  • Black output. That's the placeholder firing because the node ran without a viewport snapshot. Re-run with the UI open and the mesh loaded.
  • Path resolution. The mesh needs to live under your ComfyUI input/output/temp dirs or be an absolute path, or the lookup goes fishing and can come up empty.
  • Scope. It's an inspection and selection tool, not Blender. For generated meshes with garbage topology it won't retopologize anything - but it will let you see what you actually generated before you commit to it.
Category3D-Studio

Inputs (1)

NameTypeDefaultDescription
input_3dopt*

Outputs (1)

NameTypeDescription
IMAGEIMAGE