MV-SAM3D Run Multi-View (unofficial)
The Node That Actually Does the 3D
- scene
- result
- glb_path
- ply_path
This is the whole reason the pack exists. The Load Views and Scene From Dir nodes just prepare scenes; MV-SAM3D Run Multi-View is where your several photographs of an object actually fuse into a single mesh (.glb) and/or Gaussian splat (.ply). It wraps the official MV-SAM3D code (arXiv:2603.11633) - the multi-view extension of Meta's SAM 3D Objects - running the authors' InferencePipelinePointMap.run_multi_view unmodified. The "unofficial" in the node name is about this ComfyUI wrapper, not the research: the method underneath is straight from the paper, and it's brand new - nobody's writing tutorials about it yet.
Conceptually it's a two-stage diffusion reconstruction: stage 1 builds sparse structure, stage 2 (a SLAT-style latent pass) refines it, and the fusion weights each view by attention entropy - the paper's headline trick for deciding which camera angle to trust for each part of the object. You can leave the weighting alone; the defaults are the paper's own settings.
How it actually runs
The clever part is under the hood. This node runs in ComfyUI's own Python, but the heavy lifting happens in a subprocess launched with the sam3dobjects-nodes pixi interpreter - the isolated environment ComfyUI-SAM3DObjects already built (pytorch3d, spconv, flash-attn, the works). It writes a JSON job, spawns worker/mvsam3d_worker.py, streams its output, and raises on failure with the worker's last 30 lines instead of a mysterious empty result. The point: keep that multi-GB CUDA stack out of ComfyUI's own process and never rebuild it.
Two things to know before your first run:
- The pipeline is rebuilt from scratch every run - roughly 3 minutes of build, then 4–5 minutes of inference on a 16 GB card. That's normal, not a hang.
- Stage-wise CPU offloading is on by default and is what makes it fit 16 GB (measured 13.95 GB peak instead of ~20 GB fully resident). Disable it only on 24 GB+ cards.
The inputs that matter
scene- from Load Views or Scene From Dir.seed- defaults to 42, the paper's own example seed. Change it to vary results.stage1_steps/stage2_steps- denoise steps (50/25 by default). Fewer = faster and rougher; the paper values are a sane starting point.stage2_weight_source-entropyis the paper's main method and needs nothing extra.visibilityandmixedrequire a Depth-Anything-3 pointmap.npzfed intoda3_npz(an arraypointmaps_sam3dof shape (N,3,H,W) plusimage_files, saved without pickled objects) - and producing that file needs a separate DA3 install this pack deliberately doesn't automate. Unless you already have DA3 wired up, leave it onentropy.decode_formats- comma list,gaussian,meshby default:gaussian→ the.plysplat,mesh→ the.glb. This is the input the Export node's errors point back at.filename_prefix- output file prefix (letters/digits/._-only), defaultmvsam3d.offload(optional) - on by default; see above.
The three outputs are result (an MVSAM3D_RESULT you pass to MV-SAM3D Export), plus raw glb_path and ply_path strings if you want to skip the Export node and use them directly.
Installing - read this twice
Search ComfyUI Manager for "MV-SAM3D (Unofficial Wrapper)" (repo robinduckett/ComfyUI-MVSAM3D-Unofficial) or:
cd ComfyUI/custom_nodes
git clone --recursive https://github.com/robinduckett/ComfyUI-MVSAM3D-Unofficial.git
cd ComfyUI-MVSAM3D-Unofficial
python scripts/setup_env.py
That one-time setup_env.py installs the extra runtime deps into that env - lightning, roma, a pinned MoGe build, a kaolin stub where no wheel exists, and more.
The real prerequisite, though, is ComfyUI-SAM3DObjects installed and run once so it has produced at least one single-view mesh. That pack provisions the pixi environment (a multi-GB download/build) and downloads the SAM 3D Objects weights, including the pipeline.yaml this node auto-discovers. Skip it and every node here fails with the "could not find the sam3dobjects-nodes pixi environment" error. The pack's own example_workflows/mvsam3d_paper_example.json queues the whole chain against the paper's bundled 8-view stuffed-toy example with zero extra files - that's the fastest way to confirm your setup actually works.
Troubleshooting
- CUDA out of memory - keep
offloadon, close other GPU apps; the run peaks around 14 GB and cards under 16 GB are untested. ModuleNotFoundErrorinside the worker (lightning, roma, moge…) - the env extras are missing; re-runpython scripts/setup_env.py.- "Could not find … pipeline.yaml" - run ComfyUI-SAM3DObjects once so the weights download, or set
MVSAM3D_PIPELINE_YAML. - Overrides - node inputs
pixi_python/repo_root/pipeline_yamlbeat env vars (MVSAM3D_PIXI_PYTHONetc.) which beat auto-discovery. - ComfyUI's interrupt kills the worker cleanly at its next output line.
One licensing note: the wrapper code is MIT, but the MV-SAM3D checkout (pulled as a pinned submodule) and the SAM 3D Objects weights are under Meta's SAM License - broad commercial use, but field-of-use restrictions and share-alike. Read it before shipping.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| scene | MVSAM3D_SCENE | From MV-SAM3D Load Views or Scene From Dir. | |
| seed | INT | 420–4294967295 | Random seed (paper example uses 42). |
| stage1_steps | INT | 501–200 | Stage-1 (sparse structure) denoise steps. Paper: 50. |
| stage2_steps | INT | 251–200 | Stage-2 (SLAT) denoise steps. Paper: 25. |
| ss_weighting | BOOLEAN | true | Stage-1 attention-entropy weighting (paper method). |
| ss_entropy_layer | INT | 90–32 | Stage-1 cross-attn layer tapped for entropy. Reference: 9. |
| ss_entropy_alpha | FLOAT | 30.000–200 | Stage-1 entropy softmax temperature. Reference: 30. |
| stage2_weighting | BOOLEAN | true | Stage-2 per-view weighting on/off. |
| stage2_weight_source | COMBO | entropy | entropy = paper headline method. visibility/mixed need a DA3 npz (da3_npz input). |
| stage2_entropy_alpha | FLOAT | 30.000–200 | — |
| stage2_visibility_alpha | FLOAT | 30.000–200 | — |
| stage2_attention_layer | INT | 60–32 | Stage-2 cross-attn layer tapped for entropy. Reference: 6. |
| stage2_attention_step | INT | 00–200 | — |
| stage2_min_weight | FLOAT | 0.0010–1 | — |
| stage2_weight_combine_mode | COMBO | average | 2 options: average, multiply |
| decode_formats | STRING | gaussian,mesh | Comma list of outputs: gaussian (-> .ply splat), mesh (-> .glb). |
| filename_prefix | STRING | mvsam3d | Output file prefix (letters/digits/._- only). |
| offloadopt | BOOLEAN | true | Stage-wise CPU offloading so the run fits 16 GB VRAM (measured 13.95 GB peak). Device placement only — the fusion math is unchanged. Disable on >24 GB cards for the fully-resident original behavior. |
| da3_npzopt | STRING | Optional Depth-Anything-3 pointmap npz (pointmaps_sam3d + image_files). Required for visibility/mixed weighting. | |
| pixi_pythonopt | STRING | Empty = auto-discover the sam3dobjects-nodes env python (or set MVSAM3D_PIXI_PYTHON). | |
| repo_rootopt | STRING | Empty = bundled vendor/MV-SAM3D submodule (or set MVSAM3D_REPO). | |
| pipeline_yamlopt | STRING | Empty = auto-discover models/sam3dobjects/pipeline.yaml (or set MVSAM3D_PIPELINE_YAML). |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| result | MVSAM3D_RESULT | — |
| glb_path | STRING | — |
| ply_path | STRING | — |