π WorldMirror V2 3D Reconstruction Advanced
One-click low-VRAM mode and dense high-res splats
- 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
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_backprojectenables 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_adaptivegrows Gaussian size with depth;footprint_adaptivefollows local 3D spacing;hybrid_adaptiveuses 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 fornormalize_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_scalea 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 - dropsplat_upsample_max_pointsif 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.
Inputs (44)
| Name | Type | Default | Description |
|---|---|---|---|
| model | WORLDMIRROR_MODEL | β | |
| images | IMAGE | β | |
| use_gsplat | BOOLEAN | true | Gaussian Splatting output. Requires gsplat>=1.5.3. |
| target_sizeopt | INT | 952252β4096 | Longest side in pixels. Experimental high values are VRAM-heavy; use low-VRAM modes above 1400. |
| offload_schemeopt | COMBO | none | 2 options: none, model_cpu_offload |
| low_vram_modeopt | BOOLEAN | false | Apply the low-VRAM profile: depth_only, frame chunks=1, GS param chunks=1, transformer MLP chunks=8192. |
| head_frame_chunk_sizeopt | INT | 21β8 | Frames processed at once by depth/point/normal/GS heads. Lower values reduce VRAM, especially for FP8 multi-view runs. |
| head_compute_modeopt | COMBO | all | all computes every output head. depth+gs skips points/normals to raise the VRAM ceiling. depth_only also skips native GS. |
| gs_param_chunk_sizeopt | INT | 11β24 | Frames processed at once by the Gaussian parameter Conv2d head. 1 uses the least VRAM. |
| transformer_mlp_chunk_sizeopt | INT | 00β262144 | Token chunk size for transformer MLPs. 0 disables. Lower values reduce VRAM at high target_size but are slower. |
| confidence_percentileopt | FLOAT | 100β100 | Discard bottom N% lowest-confidence points. |
| apply_sky_maskopt | BOOLEAN | false | Remove sky. V2 uses its own depth_mask prediction β no ONNX required. |
| filter_edgesopt | BOOLEAN | true | Remove points at depth discontinuities. |
| filter_splatsopt | BOOLEAN | false | Apply filter masks to Gaussian splats. Off keeps panorama coverage and avoids mask-carved black holes. |
| edge_normal_thresholdopt | FLOAT | 1.00.1β90 | β |
| edge_depth_thresholdopt | FLOAT | 0.0300.001β0.5 | β |
| apply_confidence_maskopt | BOOLEAN | false | Discard the lowest-confidence points using confidence_percentile. Official V2 defaults this off. |
| camera_conditioningopt | COMBO | pose+intrinsics | Which input camera priors to pass into WorldMirror V2. Panorama poses are rotation-only, so testing intrinsics_only/none can reduce seam conflicts. |
| missing_camera_strategyopt | COMBO | off | When 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_sourceopt | COMBO | camera_inputs | camera_inputs backprojects depths from input cameras using ICP scale. predicted uses the model predicted cameras. |
| splat_color_sourceopt | COMBO | input_image | input_image colors every Gaussian from the source view RGB, avoiding black SH artifacts. model_sh preserves the model residual SH output. |
| adaptive_target_sizeopt | BOOLEAN | false | Clamp target_size to the input resolution, matching the official Gradio flow more closely. |
| apply_model_masksopt | BOOLEAN | false | Filter outputs using V2 native depth_mask / gs_depth_mask predictions. |
| model_mask_thresholdopt | FLOAT | 0.500β1 | Keep pixels whose native model mask is at least this value. |
| voxel_prune_splatsopt | BOOLEAN | true | Voxel-merge Gaussian splats after inference. Matches official saving flow and keeps panorama files smaller. |
| voxel_sizeopt | FLOAT | 0.00200.0001β0.1 | Voxel size used when voxel_prune_splats is enabled. |
| splat_scale_multiplieropt | FLOAT | 1.000.25β4 | Multiply Gaussian scale before saving. Increase slightly if dense visible surfaces have pinholes. |
| splat_opacity_flooropt | FLOAT | 0.000β1 | Minimum Gaussian opacity before saving. Raise for debugging holes caused by transparent splats. |
| debug_logopt | BOOLEAN | false | Print camera/depth/splat alignment diagnostics to the ComfyUI console. |
| camera_intrinsicsopt | TENSOR | Optional: intrinsics from Equirect360ToViews node. | |
| camera_posesopt | TENSOR | Optional: extrinsics from Equirect360ToViews node. | |
| depth_prioropt | IMAGE | Optional depth prior matching the input views. Enables WorldMirror cond_flags[1]. | |
| splat_upsample_modeopt | COMBO | none | Experimental: replace model splats with dense high-res splats from upsampled depth and high-res RGB. |
| splat_upsample_sizeopt | INT | 1022252β4096 | High-res splat grid size. Model inference can stay at target_size=518. |
| splat_upsample_depth_sourceopt | COMBO | gs_depth | Depth tensor to upsample and backproject into dense high-res splats. |
| splat_upsample_scaleopt | FLOAT | 0.00300.0001β0.05 | Constant Gaussian scale for high-res backprojected splats. |
| splat_upsample_scale_modeopt | COMBO | depth_adaptive | constant uses one world-space size; depth_adaptive grows with depth; footprint_adaptive follows local 3D spacing; hybrid uses both. |
| splat_upsample_depth_scale_strengthopt | FLOAT | 1.000β8 | Depth growth strength, or local footprint multiplier in footprint/hybrid modes. |
| splat_upsample_depth_scale_maxopt | FLOAT | 3.01β12 | Maximum depth-adaptive multiplier for splat_upsample_scale. |
| splat_upsample_opacityopt | FLOAT | 0.900.01β1 | Constant Gaussian opacity for high-res backprojected splats. |
| splat_upsample_voxel_pruneopt | BOOLEAN | true | Voxel-merge high-res backprojected splats before saving. |
| splat_upsample_voxel_sizeopt | FLOAT | 0.00150.0001β0.1 | Voxel size for high-res backprojected splat merge. |
| splat_upsample_max_pointsopt | INT | 90000000β50000000 | Depth-aware downsample high-res splats to this many points. 0 disables the cap. |
| splat_upsample_cap_far_biasopt | FLOAT | 1.750β8 | Preserve proportionally more far-depth splats when applying splat_upsample_max_points. |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| ply_data | PLY_DATA | β |
| depth_maps | IMAGE | β |
| normal_maps | IMAGE | β |
| camera_poses | TENSOR | β |
| camera_intrinsics | TENSOR | β |
| raw_splats | VNCCS_SPLAT | β |
| filter_mask | IMAGE | β |
| gs_filter_mask | IMAGE | β |