Nodes/ComfyUI_HYWorld2/🧩 Splat Patch POC v2
ComfyUI Node

🧩 Splat Patch POC v2

🧩 Splat Patch POC v2 β€” same job, revised knobs

By AHEKOTΒ·Created 4 months agoΒ·Updated about a month agoΒ· 74
🧩 Splat Patch POC v2
  • 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β–Ί

VNCCS_SplatPatchPOC_v2 is the revised edition of the splat-hole-finding node, and in the source it's literally a subclass of the original VNCCS_SplatPatchPOC - same inputs, same outputs, tweaked internals. If you're comparing them, think "v2 = the author's current attempt at the same problem," not "a different tool." The inputs and outputs are near-identical to the base version, so everything in the POC article applies.

The clue to what changed is in the optional list: source_pitch_filter and source_pitch_tolerance_deg are front and center. v2 filters which source cameras count based on their pitch (keeps only near-zero-pitch views by default), which matters for rooms where the original photos were shot at odd angles - a tilted source camera sees a wall at an angle and the hole detector gets confused about what's actually missing. v2 is the iteration that tries to stop that confusion at the source.

Inputs and outputs, briefly

Required: ply_data and source_images (the v1-only source_camera_poses/intrinsics are still optional). Everything else is the same parade of trajectory presets, mask modes, offset/pattern controls, and the mask_dilate/inpaint_mode pair. Outputs are the eight you'd expect: repair_images, hole_masks, repair cameras, combined_images + cameras, and hole_images.

When to reach for it

Same workflow as the base node - render new views, detect holes, get masks, send the repair images through an edit model, reassemble. The pitch filtering is the reason you'd prefer v2: if your source images come from a panorama-to-views extraction or a handheld shoot with tilted frames, the zero_pitch filter (default on, 5Β° tolerance) removes the worst offenders from the coverage math.

Fair warning applies identically: this is a POC, the mask modes are a tuning rabbit hole, and there's no magic - holes that no camera could see still need an edit model to invent content. Expect to iterate on trajectory_preset and mask_mode before the masks look right.

Install

Same pack, same ritual:

cd ComfyUI/custom_nodes
git clone https://github.com/AHEKOT/ComfyUI_HYWorld2
cd ComfyUI_HYWorld2
pip install -r requirements.txt
python install.py

Or ComfyUI Manager β†’ HY-World 2.0. As with all the splat-patch nodes, use_gsplat defaults on and leans on the vendored gsplat_maskgaussian fork - keep upstream gsplat out of the environment.

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β€”