ComfyUI Node

FuseSplats

Merge two splat clouds into one without the doubles

By Alexankharin·Created about a year ago·Updated about a month ago· 36
FuseSplats
  • splats_a
  • splats_b
  • fused_splats
voxel_size0.010
modesmart
weight_a1.00
weight_b1.00
deviceauto

Merge two splat clouds and you get double geometry where they overlap - two sets of splats fighting over the same space, rendering as mush or ghosting. FuseSplats is the smarter merge: instead of just concatenating, it voxelizes the overlapping regions and resolves the collision with a per-voxel reduction, so the result is one clean cloud with no duplicate shell.

It's the connective tissue of multi-view splat building. The pack's VideoToFusedSplats path accumulates keyframes by fusing each new SHARP prediction into the running world cloud, and this node is how the static fisheye variant stitches its frame-0 splats together. If you're doing any "predict splats per view, then combine" work by hand, this is the node that makes the seams disappear.

The inputs

  • splats_a and splats_b - two GSPLAT objects (from ImageToSplat, FisheyeToGaussian, LoadPlySplat, or another FuseSplats).
  • voxel_size (default 0.01) - the voxel edge length used to decide "these splats overlap." This is the resolution of the merge: too big and distinct geometry gets averaged together; too small and overlapping splats slip through as doubles. 0 disables voxel merging, which turns the node into a plain concatenation.
  • mode - the per-voxel reduction. The default smart is the sensible choice; the family also includes keep/discard/average variants for when you want one input to win outright.
  • weight_a / weight_b (default 1 each) - confidence or "recency" weights used by smart/average modes. This is your bias dial: if splats_a is the newer, higher-quality prediction, give it a higher weight so it dominates contested space.

The output is fused_splats (GSPLAT), same type in, same type out - so you can chain fuses (a ⊕ b then ⊕ c) to accumulate many views incrementally, which is exactly how the pack's video fusion works.

Practical notes

Keep the two clouds in the same world frame and scale before fusing. FuseSplats resolves collisions, it doesn't align scenes - feed it a rotated or differently-scaled cloud and "smart" will happily average geometry that was never meant to touch. For scale alignment, run SHARP output through DepthScaleAnchor against metric depth (the pack does this internally in the video path); for rotation, use RotateSplats with the pose matrix.

Also worth knowing: weight_a/weight_b aren't just for aesthetics. In a video fusion loop, later keyframes are usually more reliable (earlier ones had worse disocclusion), so bumping the incoming keyframe's weight is the standard trick for keeping the merged cloud crisp.

Install

Shared camera-comfyUI install: Manager → search "camera-comfyUI" → Install, or clone https://github.com/Alexankharin/camera-comfyUI into custom_nodes/ and run python install.py. This node needs gsplat to do the voxel work - if it errors out at run time, that's the missing piece; re-running python install.py fixes it.

Troubleshooting

  • Doubles still visible: voxel_size too small (or 0). Increase it until the ghosting collapses.
  • Geometry blobs where two views met: voxel_size too big, or the clouds weren't scale/pose aligned before fusing. Check alignment first.
  • Fused cloud favors the wrong input: adjust weight_a/weight_b - or switch mode to a hard keep/discard if one input is just better.
  • Slow on big clouds: voxel merging is the expensive part. Merge in chunks, or raise voxel_size for a coarse-then-fine strategy.
CategoryCamera/GSplat

Inputs (7)

NameTypeDefaultDescription
splats_aGSPLAT
splats_bGSPLAT
voxel_sizeFLOAT0.0100–10Voxel edge length used to merge overlapping splats. 0 disables voxel merging.
modeCOMBOsmart4 options: smart, average, discard, keep
weight_aFLOAT1.000–1000Confidence/recency weight for splats_a (used by smart/average modes).
weight_bFLOAT1.000–1000Confidence/recency weight for splats_b (used by smart/average modes).
deviceoptCOMBOauto3 options: auto, cpu, cuda

Outputs (1)

NameTypeDescription
fused_splatsGSPLAT