π WorldMirror V2 3D Reconstruction
The V2 reconstruction node with splat upsampling built in
- 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 V2 engine room. Where the V1 VNCCS_WorldMirror3D reconstructs and leaves it at that, VNCCS_WorldMirrorV2_3D adds the thing people actually want from a splat: density. It runs HY-World 2.0 inference and then upsamples - backprojecting the depth into dense high-resolution Gaussians - so the output splat has real surface, not a sparse skeleton you need to squint at.
Wire it after VNCCS_LoadWorldMirrorV2Model. Required inputs are just model and images; the defaults are tuned to run on a 16 GB card (low_vram_mode is on by default, which chunked the heavy parts so you don't OOM on a mid-range GPU).
What the toggles actually do
low_vram_mode(default on) - applies a profile that splits inference into depth-only, frame chunk 1, and chunked transformer MLPs. Turn it off only if you have a big card and want max speed.enable_splat_upsample(default on) - the headline feature. Disable when you only want depth maps.splat_upsample_scale_mode-constant,depth_adaptive,footprint_adaptive,hybrid_adaptive. The adaptive modes grow Gaussian size with distance (or local 3D spacing), which fixes the classic problem where far walls dissolve into gaps. Defaultdepth_adaptiveis a sane starting point.splat_upsample_voxel_prune+voxel_size- voxel-merges overlapping splats to shrink the file. Leave it on; a dense 9M-point splat is a big file otherwise.splat_camera_source-camera_inputsbackprojects from your supplied cameras using ICP scale;predicteduses the model's own cameras. If you connect cameras fromEquirect360ToViewsor WorldStereo, keep the default.target_size- default 518, and the tooltip warns that high values are VRAM-heavy. Remember: dense splats can be upsampled separately, so you don't need a huge inference resolution.
Outputs mirror the V1 node - ply_data, depth_maps, normal_maps, camera_poses, camera_intrinsics, raw_splats - plus filter_mask and gs_filter_mask (which pixels/splats survived the sky and edge filtering), useful for debugging.
Honest expectations
HY-World 2.0 is essentially an improved WorldMirror, and panorama assembly is where V2 still struggles - the author's own words are that the model "does not assemble the final model very well from different cameras" and needs "a great deal of VRAM at decent resolution." Flat images work great; multi-camera rooms are the frontier. For those, use_consensus-style merging lives on the V1 node, so a V1/V2 hybrid isn't crazy if you're fighting ghosting.
Install
Search HY-World 2.0 in Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/AHEKOT/ComfyUI_HYWorld2
cd ComfyUI_HYWorld2
pip install -r requirements.txt
python install.py
That last step compiles the vendored gsplat_maskgaussian CUDA fork and installs it under the gsplat name - never install upstream gsplat from PyPI alongside it. Needs CUDA Toolkit + ninja (+ MSVC on Windows). The V2 checkpoint downloads from tencent/HY-World-2.0 on first load and it's a big one.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| model | WORLDMIRROR_MODEL | β | |
| images | IMAGE | β | |
| target_sizeopt | INT | 518252β4096 | Model inference resolution. Experimental high values are VRAM-heavy; dense splats can be upsampled separately. |
| offload_schemeopt | COMBO | none | Move model weights to CPU between GPU use to reduce VRAM at the cost of speed. |
| low_vram_modeopt | BOOLEAN | true | Apply the low-VRAM profile: depth_only, frame chunks=1, GS param chunks=1, transformer MLP chunks=8192. |
| apply_sky_maskopt | BOOLEAN | false | Remove sky-like regions before saving. Useful for outdoor panoramas where sky can create far/infinite splats. |
| debug_logopt | BOOLEAN | false | Print camera/depth/splat alignment diagnostics to the ComfyUI console. |
| enable_splat_upsampleopt | BOOLEAN | true | Build dense high-resolution splats from depth. Disable when only depth maps are needed. |
| splat_upsample_scaleopt | FLOAT | 0.00300.0001β0.05 | Gaussian size for dense backprojected splats. |
| splat_upsample_scale_modeopt | COMBO | depth_adaptive | constant uses one Gaussian 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 multiplier over splat_upsample_scale for adaptive modes. |
| splat_upsample_voxel_pruneopt | BOOLEAN | true | Voxel-merge dense splats to reduce file size. |
| splat_upsample_voxel_sizeopt | FLOAT | 0.00150.0001β0.1 | Voxel size for dense splat compression. |
| splat_upsample_max_pointsopt | INT | 90000000β50000000 | Depth/distance-aware cap for dense splats. Lower values reduce file size; higher values preserve distant surfaces. |
| splat_upsample_cap_far_biasopt | FLOAT | 1.750β8 | Preserve proportionally more far splats when applying the point cap. |
| splat_camera_sourceopt | COMBO | camera_inputs | camera_inputs backprojects depths from input cameras using ICP scale. predicted uses the model predicted cameras. |
| camera_intrinsicsopt | TENSOR | Optional: intrinsics from Equirect360ToViews or WorldStereo. | |
| camera_posesopt | TENSOR | Optional: camera poses from Equirect360ToViews or WorldStereo. | |
| depth_prioropt | IMAGE | Optional depth prior matching the input views. |
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 | β |