Nodes/ComfyUI_HYWorld2/🌍 WorldMirror V2 3D Reconstruction Advanced
ComfyUI Node

🌍 WorldMirror V2 3D Reconstruction Advanced

One-click low-VRAM mode and dense high-res splats

By AHEKOTΒ·Created 4 months agoΒ·Updated about a month agoΒ· 74
🌍 WorldMirror V2 3D Reconstruction Advanced
  • model
  • images
  • camera_intrinsics
  • camera_poses
  • depth_prior
  • ply_data
  • depth_maps
  • normal_maps
  • camera_poses
  • camera_intrinsics
  • raw_splats
  • filter_mask
  • gs_filter_mask
β—„use_gsplattrueβ–Ί
β—„target_size952β–Ί
β—„offload_schemenoneβ–Ί
β—„low_vram_modefalseβ–Ί
β—„head_frame_chunk_size2β–Ί
β—„head_compute_modeallβ–Ί
β—„gs_param_chunk_size1β–Ί
β—„transformer_mlp_chunk_size0β–Ί
β—„confidence_percentile10β–Ί
β—„apply_sky_maskfalseβ–Ί
β—„filter_edgestrueβ–Ί
β—„filter_splatsfalseβ–Ί
β—„edge_normal_threshold1.0β–Ί
β—„edge_depth_threshold0.030β–Ί
β—„apply_confidence_maskfalseβ–Ί
β—„camera_conditioningpose+intrinsicsβ–Ί
β—„missing_camera_strategyoffβ–Ί
β—„splat_camera_sourcecamera_inputsβ–Ί
β—„splat_color_sourceinput_imageβ–Ί
β—„adaptive_target_sizefalseβ–Ί
β—„apply_model_masksfalseβ–Ί
β—„model_mask_threshold0.50β–Ί
β—„voxel_prune_splatstrueβ–Ί
β—„voxel_size0.0020β–Ί
β—„splat_scale_multiplier1.00β–Ί
β—„splat_opacity_floor0.00β–Ί
β—„debug_logfalseβ–Ί
β—„splat_upsample_modenoneβ–Ί
β—„splat_upsample_size1022β–Ί
β—„splat_upsample_depth_sourcegs_depthβ–Ί
β—„splat_upsample_scale0.0030β–Ί
β—„splat_upsample_scale_modedepth_adaptiveβ–Ί
β—„splat_upsample_depth_scale_strength1.00β–Ί
β—„splat_upsample_depth_scale_max3.0β–Ί
β—„splat_upsample_opacity0.90β–Ί
β—„splat_upsample_voxel_prunetrueβ–Ί
β—„splat_upsample_voxel_size0.0015β–Ί
β—„splat_upsample_max_points9000000β–Ί
β—„splat_upsample_cap_far_bias1.75β–Ί

The Experimental label here isn't marketing drama - it's the actual reason the node exists. The code docstring says it plainly: this WorldMirror V2 variant is kept as a separate node ID so new knobs can evolve without changing saved state on the stable reconstruction node. New features land here first, get tested, and the stable node stays boring. If you want the latest WorldMirror tricks without rebuilding a workflow every week, this is where to look.

It's also the only place in the pack where you get two genuinely useful conveniences: a one-click low_vram_mode and the dense high-res splat upsampler.

What it does differently

Mechanically it's the same feed-forward reconstruction as the rest of the family - images in, depth/normals/point cloud/splats out, all chunked to fit VRAM. Two things set it apart:

low_vram_mode is a single switch that applies the whole low-VRAM profile at once: depth_only head mode, 1 frame per head chunk, 1 GS param chunk, and 8192-token transformer MLP chunks. On a 16GB card with a high target_size, that's the difference between "it runs, slowly" and "it OOMs instantly". On the Advanced node you'd set all four of those by hand; here it's a checkbox.

splat_upsample_mode is the headline experiment: set it to depth_backproject and the node throws away the model's native splats and rebuilds dense, higher-resolution ones from upsampled depth plus high-res RGB. The neat trick is you can run model inference at a small target_size (the tooltip suggests 518) and still get a big splat grid via splat_upsample_size (default 1022) - the expensive part stays cheap, the splat still gets dense.

Inputs worth touching

  • model / images / use_gsplat - same as every V2 node. Model comes from VNCCS_LoadWorldMirrorV2Model.
  • low_vram_mode - the convenience switch above. Off by default; flip it on before cranking target_size.
  • splat_upsample_mode - depth_backproject enables the dense splat path.
  • splat_upsample_size - the high-res splat grid size. Bigger = denser, more VRAM at save time.
  • splat_upsample_scale_mode - default depth_adaptive grows Gaussian size with depth; footprint_adaptive follows local 3D spacing; hybrid_adaptive uses both. Good starting point, rarely needs touching.
  • splat_upsample_max_points - 9M default cap on the upsampled splats, depth-aware so distant geometry isn't the first thing culled (see splat_upsample_cap_far_bias).

Outputs are the full set: ply_data (PLY_DATA β†’ VNCCS_PLYSceneRenderer or VNCCS_SavePLY), depth_maps, normal_maps, camera_poses, camera_intrinsics, raw_splats (VNCCS_SPLAT β†’ VNCCS_SplatRefiner), plus filter_mask and gs_filter_mask for debugging.

Install

Pack-level install, same as its siblings - Manager search "HY-World 2.0", or:

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

install.py builds the vendored gsplat_maskgaussian fork, recast/navmesh, and PyTorch3D from source - CUDA toolkit matching your torch, ninja, and (on Windows) MSVC build tools required. Don't install upstream gsplat; the fork's rasterizer args won't exist there.

Gotchas

  • Same display name as Advanced. Both show as "🌍 WorldMirror V2 3D Reconstruction Advanced" in the node menu. The Experimental one is the one with low_vram_mode; the Advanced one swaps that for normalize_camera_poses_to_first. Check the class name before you wire it up.
  • If your dense splats have pinholes on visible surfaces, bump splat_upsample_scale a touch (default 0.003) rather than chasing the scale mode.
  • Watch the point cap on huge panoramas. At 9M points and a big splat_upsample_size, the save step can get chunky - drop splat_upsample_max_points if file size or the final write is your bottleneck.
  • It's experimental for a reason. The splat-upsample path is where the author tests new ideas; if a new knob is flaky, the stable node is the escape hatch, not this one.
CategoryVNCCS/3D/Experimental

Inputs (44)

NameTypeDefaultDescription
modelWORLDMIRROR_MODELβ€”
imagesIMAGEβ€”
use_gsplatBOOLEANtrueGaussian Splatting output. Requires gsplat>=1.5.3.
target_sizeoptINT952252–4096Longest side in pixels. Experimental high values are VRAM-heavy; use low-VRAM modes above 1400.
offload_schemeoptCOMBOnone2 options: none, model_cpu_offload
low_vram_modeoptBOOLEANfalseApply the low-VRAM profile: depth_only, frame chunks=1, GS param chunks=1, transformer MLP chunks=8192.
head_frame_chunk_sizeoptINT21–8Frames processed at once by depth/point/normal/GS heads. Lower values reduce VRAM, especially for FP8 multi-view runs.
head_compute_modeoptCOMBOallall computes every output head. depth+gs skips points/normals to raise the VRAM ceiling. depth_only also skips native GS.
gs_param_chunk_sizeoptINT11–24Frames processed at once by the Gaussian parameter Conv2d head. 1 uses the least VRAM.
transformer_mlp_chunk_sizeoptINT00–262144Token chunk size for transformer MLPs. 0 disables. Lower values reduce VRAM at high target_size but are slower.
confidence_percentileoptFLOAT100–100Discard bottom N% lowest-confidence points.
apply_sky_maskoptBOOLEANfalseRemove sky. V2 uses its own depth_mask prediction β€” no ONNX required.
filter_edgesoptBOOLEANtrueRemove points at depth discontinuities.
filter_splatsoptBOOLEANfalseApply filter masks to Gaussian splats. Off keeps panorama coverage and avoids mask-carved black holes.
edge_normal_thresholdoptFLOAT1.00.1–90β€”
edge_depth_thresholdoptFLOAT0.0300.001–0.5β€”
apply_confidence_maskoptBOOLEANfalseDiscard the lowest-confidence points using confidence_percentile. Official V2 defaults this off.
camera_conditioningoptCOMBOpose+intrinsicsWhich input camera priors to pass into WorldMirror V2. Panorama poses are rotation-only, so testing intrinsics_only/none can reduce seam conflicts.
missing_camera_strategyoptCOMBOoffWhen camera inputs are missing, derive pseudo input cameras from WorldMirror predictions. stabilize_predicted_intrinsics keeps predicted poses but uses sequence-median focal lengths. reproject_stabilized_predicted also rebuilds pts3d/splat means from depth with those stable cameras.
splat_camera_sourceoptCOMBOcamera_inputscamera_inputs backprojects depths from input cameras using ICP scale. predicted uses the model predicted cameras.
splat_color_sourceoptCOMBOinput_imageinput_image colors every Gaussian from the source view RGB, avoiding black SH artifacts. model_sh preserves the model residual SH output.
adaptive_target_sizeoptBOOLEANfalseClamp target_size to the input resolution, matching the official Gradio flow more closely.
apply_model_masksoptBOOLEANfalseFilter outputs using V2 native depth_mask / gs_depth_mask predictions.
model_mask_thresholdoptFLOAT0.500–1Keep pixels whose native model mask is at least this value.
voxel_prune_splatsoptBOOLEANtrueVoxel-merge Gaussian splats after inference. Matches official saving flow and keeps panorama files smaller.
voxel_sizeoptFLOAT0.00200.0001–0.1Voxel size used when voxel_prune_splats is enabled.
splat_scale_multiplieroptFLOAT1.000.25–4Multiply Gaussian scale before saving. Increase slightly if dense visible surfaces have pinholes.
splat_opacity_flooroptFLOAT0.000–1Minimum Gaussian opacity before saving. Raise for debugging holes caused by transparent splats.
debug_logoptBOOLEANfalsePrint camera/depth/splat alignment diagnostics to the ComfyUI console.
camera_intrinsicsoptTENSOROptional: intrinsics from Equirect360ToViews node.
camera_posesoptTENSOROptional: extrinsics from Equirect360ToViews node.
depth_prioroptIMAGEOptional depth prior matching the input views. Enables WorldMirror cond_flags[1].
splat_upsample_modeoptCOMBOnoneExperimental: replace model splats with dense high-res splats from upsampled depth and high-res RGB.
splat_upsample_sizeoptINT1022252–4096High-res splat grid size. Model inference can stay at target_size=518.
splat_upsample_depth_sourceoptCOMBOgs_depthDepth tensor to upsample and backproject into dense high-res splats.
splat_upsample_scaleoptFLOAT0.00300.0001–0.05Constant Gaussian scale for high-res backprojected splats.
splat_upsample_scale_modeoptCOMBOdepth_adaptiveconstant uses one world-space size; depth_adaptive grows with depth; footprint_adaptive follows local 3D spacing; hybrid uses both.
splat_upsample_depth_scale_strengthoptFLOAT1.000–8Depth growth strength, or local footprint multiplier in footprint/hybrid modes.
splat_upsample_depth_scale_maxoptFLOAT3.01–12Maximum depth-adaptive multiplier for splat_upsample_scale.
splat_upsample_opacityoptFLOAT0.900.01–1Constant Gaussian opacity for high-res backprojected splats.
splat_upsample_voxel_pruneoptBOOLEANtrueVoxel-merge high-res backprojected splats before saving.
splat_upsample_voxel_sizeoptFLOAT0.00150.0001–0.1Voxel size for high-res backprojected splat merge.
splat_upsample_max_pointsoptINT90000000–50000000Depth-aware downsample high-res splats to this many points. 0 disables the cap.
splat_upsample_cap_far_biasoptFLOAT1.750–8Preserve proportionally more far-depth splats when applying splat_upsample_max_points.

Outputs (8)

NameTypeDescription
ply_dataPLY_DATAβ€”
depth_mapsIMAGEβ€”
normal_mapsIMAGEβ€”
camera_posesTENSORβ€”
camera_intrinsicsTENSORβ€”
raw_splatsVNCCS_SPLATβ€”
filter_maskIMAGEβ€”
gs_filter_maskIMAGEβ€”