Nodes/Image MetaHub Save Node/MetaHub Save 3D Model
ComfyUI Node

MetaHub Save 3D Model

The only 3D save node that remembers how the mesh was born

By LuqP2·Created 8 months ago·Updated about 9 hours ago· 15
MetaHub Save 3D Model
  • model_3d
    filename_prefix3d/ComfyUI
    tags
    notes
    project_name
    generation_time_override

    ComfyUI's built-in 3D save is a cold end to a hot workflow. SaveGLB writes the mesh and drops everything else - the prompts, the seed, the model, the LoRAs that shaped it are gone, and six months later you're staring at a .glb you can't even tell which checkpoint produced. MetaHub Save 3D Model fixes exactly that: it's the save node from the Image MetaHub pack that stamps a full generation recipe onto your mesh, both embedded in the file and as a readable sidecar.

    It's the official companion node for Image MetaHub, a free, local-only image browser for the 20k-PNGs-of-chaos crowd. That app lives on the metadata your normal save nodes throw away, and this node is how you get that metadata out of ComfyUI's 3D corner. No API, no cloud, no key - everything happens on your machine.

    How it works

    Wire it up and it reads the graph, not a form. It walks your workflow, pulls out seed, steps, CFG, sampler, scheduler, positive/negative prompts, the checkpoint name plus its SHA256 hash, and any LoRA stack, then bundles that with telemetry (VRAM peak, GPU device, generation time) into one JSON payload. The payload goes two places: a sidecar file, <name>.glb.imagemetahub.json, next to every save in every format, and - for GLB only - embedded inside the file at asset.extras.imagemetahub_data, which is the glTF 2.0 standard spot for exactly this kind of thing. --disable-metadata nukes both; the mesh still saves.

    The input side matters more than the metadata, though. The model_3d socket is a wildcard that accepts two very different things:

    • A ComfyUI MESH (from ComfyUI-3D-Pack or the native nodes) - a batch of vertex/face tensors with optional vertex colors, UVs, and a texture. The node hand-writes a real glTF 2.0 binary: texture embedded as a PNG, transparency promoted to BLEND alpha mode, and an optional unlit material. It writes this as .glb.
    • A File3D object - something that already knows its own format (GLB, GLTF, OBJ, FBX, STL). It just calls save_to() and keeps whatever format the upstream node produced.

    That second path is the quiet win: mesh → GLB, but your File3D stays OBJ if that's what you need for a slicer or Blender.

    The inputs that matter

    Only two are required, and you'll probably leave one alone:

    • model_3d - the mesh or File3D. Connect this and the node does the rest.
    • filename_prefix - default 3d/ComfyUI, which lands files in output/3d/ComfyUI_00001_.glb with the usual auto-incrementing counter.

    Optional fields are the Image MetaHub organizer stuff: tags, notes, and project_name (so files arrive pre-sorted in the app), plus generation_time_override - feed it the elapsed_time output from the same pack's MetaHub Timer node for honest timing instead of a rough estimate. There are no output sockets - it's an output node - but it pushes ui.3d, so ComfyUI's native 3D preview shows the saved model right in the graph.

    Installing it

    Standard fare, no heavy deps. ComfyUI Manager → search Image MetaHub Save → install → restart. Or by hand:

    cd ComfyUI/custom_nodes
    git clone https://github.com/LuqP2/ImageMetaHub-ComfyUI-Save.git
    cd ImageMetaHub-ComfyUI-Save
    pip install -r requirements.txt
    

    Then restart ComfyUI and look for MetaHub Save 3D Model under 3d/save. Its dependencies are just numpy and Pillow - both already in any ComfyUI install, so there's no CUDA wheel roulette like the rest of the 3D ecosystem.

    Where people trip

    • Wrong input type. It's a wildcard socket, so a GS_PLY splat or point cloud will connect visually, then throw TypeError: expected a MESH or File3D value at runtime. If you want splats saved, you're in the wrong node.
    • Empty or broken meshes. An empty mesh raises "Cannot save an empty 3D mesh"; out-of-range face indices raise a clear error. Generated 3D often has garbage topology - that's a mesh-quality problem, not a node bug, and the error is at least honest about it.
    • Metadata missing but file saved. If the extractor can't parse a custom node in your graph, the save still succeeds and flags the metadata partial - the mesh is never the casualty.
    • "Where did my files go?" It uses the same folder_paths counter system as SaveImage, so batch items get _00001_, _00002_ suffixes in output/3d/.

    Given this pack has effectively zero search visibility yet, you may be an early adopter - but the mechanism is solid, the GLB writer is genuinely hand-rolled, and for anyone who wants their 3D outputs as reproducible as their PNGs, this is the one.

    Category3d/save

    Inputs (6)

    NameTypeDefaultDescription
    model_3d*ComfyUI MESH or File3D model
    filename_prefixSTRING3d/ComfyUI
    tagsoptSTRING
    notesoptSTRING
    project_nameoptSTRING
    generation_time_overrideoptFLOAT

    Outputs (0)

    No outputs