FuseSplats
Merge two splat clouds into one without the doubles
- splats_a
- splats_b
- fused_splats
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_aandsplats_b- twoGSPLATobjects (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 defaultsmartis 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: ifsplats_ais 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_sizetoo small (or 0). Increase it until the ghosting collapses. - Geometry blobs where two views met:
voxel_sizetoo 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 switchmodeto 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_sizefor a coarse-then-fine strategy.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| splats_a | GSPLAT | — | |
| splats_b | GSPLAT | — | |
| voxel_size | FLOAT | 0.0100–10 | Voxel edge length used to merge overlapping splats. 0 disables voxel merging. |
| mode | COMBO | smart | 4 options: smart, average, discard, keep |
| weight_a | FLOAT | 1.000–1000 | Confidence/recency weight for splats_a (used by smart/average modes). |
| weight_b | FLOAT | 1.000–1000 | Confidence/recency weight for splats_b (used by smart/average modes). |
| deviceopt | COMBO | auto | 3 options: auto, cpu, cuda |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| fused_splats | GSPLAT | — |