Nodes/ComfyUI_HYWorld2/🧩 Splat Patch POC
ComfyUI Node

🧩 Splat Patch POC

🧩 Render a splat, find the holes, prep them for repair

By AHEKOTΒ·Created 4 months agoΒ·Updated about a month agoΒ· 74
🧩 Splat Patch POC
  • ply_data
  • source_images
  • source_camera_poses
  • source_camera_intrinsics
  • repair_images
  • hole_masks
  • repair_camera_poses
  • repair_camera_intrinsics
  • combined_images
  • combined_camera_poses
  • combined_camera_intrinsics
  • hole_images
β—„view_count8β–Ί
β—„width1022β–Ί
β—„height1022β–Ί
β—„fov90β–Ί
β—„trajectory_presetcustomβ–Ί
β—„source_pitch_filterzero_pitchβ–Ί
β—„source_pitch_tolerance_deg5.0β–Ί
β—„offset_modescene_fractionβ–Ί
β—„side_offset0.12β–Ί
β—„dual_side_offsetsfalseβ–Ί
β—„forward_offset0.03β–Ί
β—„patternleft_right_forwardβ–Ί
β—„clamp_to_splat_boundstrueβ–Ί
β—„bounds_margin_fraction0.08β–Ί
β—„mask_modealpha_pixelsβ–Ί
β—„coverage_threshold0.08β–Ί
β—„support_angle_deg75β–Ί
β—„min_hole_area_ratio0.005β–Ί
β—„dark_threshold0.045β–Ί
β—„dark_max_alpha0.55β–Ί
β—„dark_min_area_ratio0.0005β–Ί
β—„dark_mask_dilate3β–Ί
β—„inpaint_modeteleaβ–Ί
β—„mask_dilate9β–Ί
β—„combine_with_sourcetrueβ–Ί
β—„use_gsplattrueβ–Ί
β—„max_render_points1200000β–Ί

Every feed-forward splat has holes - spots no source camera saw, so the reconstruction is empty there. VNCCS_SplatPatchPOC (proof of concept) is the pack's attempt to close the loop: render the splat from new angles, detect the missing regions, and hand you ready-to-repair images and masks. It's the "find the gaps and prep them" stage of the splat-repair pipeline.

The name says experimental, and it means it - this node has an enormous optional input list (roughly two dozen knobs) because it's a workbench for a problem that isn't solved. But the core flow is simple: give it your ply_data (from a reconstruction or LoadPLYFile) and source_images, it renders new views along a trajectory, compares them against what the source cameras saw, and outputs where the scene is missing.

What comes out

  • repair_images - new renders, ready to be passed through an edit/inpaint model to fill the holes.
  • hole_masks - masks marking exactly the missing regions, for inpaint conditioning.
  • repair_camera_poses / repair_camera_intrinsics - so whatever you generate can be projected back into 3D.
  • combined_images + combined cameras - repair and source views merged into one batch (controlled by combine_with_source).
  • hole_images - the holes alone, for quick inspection.

The knobs that matter (of the many)

  • trajectory_preset - custom, orbit_sideways, orbit_center, room_corners_upper_lower, wall_midpoints, floor_ceiling_orbit, diagonal_cross. This is where most of the quality lives: pick a camera path that actually looks at the missing parts.
  • mask_mode - how "missing" is detected: alpha_pixels, black_pixels, dark_regions, source_support, and combinations. Default alpha_pixels is a fine start; dark_regions catches the shadowy voids that fool alpha checks.
  • coverage_threshold, support_angle_deg, min_hole_area_ratio - the three dials for "how big does a gap have to be to matter." Start with defaults, tune down min_hole_area_ratio if you want to patch small flecks.
  • inpaint_mode + mask_dilate - the pack does a built-in OpenCV inpaint pass (telea, navier_stokes, median) on the holes; you can set it to none and do the filling yourself in an edit model. mask_dilate grows the mask so seams blend.
  • view_count, width, height, fov - render budget. Fewer views + lower res = fast iteration.
  • use_gsplat / max_render_points - rendering performance and point budget.

Reality check

This is genuinely experimental - expect fiddly results and a learning curve on the mask modes. The practical approach: render a few views with trajectory_preset, inspect hole_images, tune the mask settings until the holes are right, then send repair_images + hole_masks through your image-edit model of choice. The SplatPatchAssemble node is the intended next step to stitch your repairs back in.

Install

Standard for this pack (Manager β†’ HY-World 2.0, or the clone + pip install -r requirements.txt + python install.py ritual). The gsplat fork from install.py matters here - use_gsplat is on by default and it's the fast path.

CategoryVNCCS/3D/Experimental

Inputs (31)

NameTypeDefaultDescription
ply_dataPLY_DATAβ€”
source_imagesIMAGEβ€”
source_camera_posesoptTENSORβ€”
source_camera_intrinsicsoptTENSORβ€”
view_countoptINT81–64β€”
widthoptINT1022252–2048β€”
heightoptINT1022252–2048β€”
fovoptFLOAT9030–130β€”
trajectory_presetoptCOMBOcustom7 options: custom, orbit_sideways, orbit_center, room_corners_upper_lower, wall_midpoints, floor_ceiling_orbit, +1
source_pitch_filteroptCOMBOzero_pitch2 options: zero_pitch, all
source_pitch_tolerance_degoptFLOAT5.00–45β€”
offset_modeoptCOMBOscene_fraction2 options: scene_fraction, world_units
side_offsetoptFLOAT0.12-2–2β€”
dual_side_offsetsoptBOOLEANfalseβ€”
forward_offsetoptFLOAT0.03-2–2β€”
patternoptCOMBOleft_right_forward2 options: alternate_left_right, left_right_forward
clamp_to_splat_boundsoptBOOLEANtrueβ€”
bounds_margin_fractionoptFLOAT0.080–0.45β€”
mask_modeoptCOMBOalpha_pixels8 options: alpha_pixels, black_pixels, dark_regions, dark_regions_with_support_gate, source_support, alpha, +2
coverage_thresholdoptFLOAT0.080–1β€”
support_angle_degoptFLOAT750–180β€”
min_hole_area_ratiooptFLOAT0.0050–0.5β€”
dark_thresholdoptFLOAT0.0450–0.5β€”
dark_max_alphaoptFLOAT0.550–1β€”
dark_min_area_ratiooptFLOAT0.00050–0.1β€”
dark_mask_dilateoptINT30–51β€”
inpaint_modeoptCOMBOtelea4 options: telea, navier_stokes, median, none
mask_dilateoptINT90–101β€”
combine_with_sourceoptBOOLEANtrueβ€”
use_gsplatoptBOOLEANtrueβ€”
max_render_pointsoptINT12000000–20000000β€”

Outputs (8)

NameTypeDescription
repair_imagesIMAGEβ€”
hole_masksMASKβ€”
repair_camera_posesTENSORβ€”
repair_camera_intrinsicsTENSORβ€”
combined_imagesIMAGEβ€”
combined_camera_posesTENSORβ€”
combined_camera_intrinsicsTENSORβ€”
hole_imagesIMAGEβ€”