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

🌍 WorldMirror V2 3D Reconstruction

The V2 reconstruction node with splat upsampling built in

By AHEKOTΒ·Created 4 months agoΒ·Updated about a month agoΒ· 74
🌍 WorldMirror V2 3D Reconstruction
  • 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
β—„target_size518β–Ί
β—„offload_schemenoneβ–Ί
β—„low_vram_modetrueβ–Ί
β—„apply_sky_maskfalseβ–Ί
β—„debug_logfalseβ–Ί
β—„enable_splat_upsampletrueβ–Ί
β—„splat_upsample_scale0.0030β–Ί
β—„splat_upsample_scale_modedepth_adaptiveβ–Ί
β—„splat_upsample_depth_scale_strength1.00β–Ί
β—„splat_upsample_depth_scale_max3.0β–Ί
β—„splat_upsample_voxel_prunetrueβ–Ί
β—„splat_upsample_voxel_size0.0015β–Ί
β—„splat_upsample_max_points9000000β–Ί
β—„splat_upsample_cap_far_bias1.75β–Ί
β—„splat_camera_sourcecamera_inputsβ–Ί

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. Default depth_adaptive is 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_inputs backprojects from your supplied cameras using ICP scale; predicted uses the model's own cameras. If you connect cameras from Equirect360ToViews or 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.

CategoryVNCCS/3D

Inputs (20)

NameTypeDefaultDescription
modelWORLDMIRROR_MODELβ€”
imagesIMAGEβ€”
target_sizeoptINT518252–4096Model inference resolution. Experimental high values are VRAM-heavy; dense splats can be upsampled separately.
offload_schemeoptCOMBOnoneMove model weights to CPU between GPU use to reduce VRAM at the cost of speed.
low_vram_modeoptBOOLEANtrueApply the low-VRAM profile: depth_only, frame chunks=1, GS param chunks=1, transformer MLP chunks=8192.
apply_sky_maskoptBOOLEANfalseRemove sky-like regions before saving. Useful for outdoor panoramas where sky can create far/infinite splats.
debug_logoptBOOLEANfalsePrint camera/depth/splat alignment diagnostics to the ComfyUI console.
enable_splat_upsampleoptBOOLEANtrueBuild dense high-resolution splats from depth. Disable when only depth maps are needed.
splat_upsample_scaleoptFLOAT0.00300.0001–0.05Gaussian size for dense backprojected splats.
splat_upsample_scale_modeoptCOMBOdepth_adaptiveconstant uses one Gaussian 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 multiplier over splat_upsample_scale for adaptive modes.
splat_upsample_voxel_pruneoptBOOLEANtrueVoxel-merge dense splats to reduce file size.
splat_upsample_voxel_sizeoptFLOAT0.00150.0001–0.1Voxel size for dense splat compression.
splat_upsample_max_pointsoptINT90000000–50000000Depth/distance-aware cap for dense splats. Lower values reduce file size; higher values preserve distant surfaces.
splat_upsample_cap_far_biasoptFLOAT1.750–8Preserve proportionally more far splats when applying the point cap.
splat_camera_sourceoptCOMBOcamera_inputscamera_inputs backprojects depths from input cameras using ICP scale. predicted uses the model predicted cameras.
camera_intrinsicsoptTENSOROptional: intrinsics from Equirect360ToViews or WorldStereo.
camera_posesoptTENSOROptional: camera poses from Equirect360ToViews or WorldStereo.
depth_prioroptIMAGEOptional depth prior matching the input views.

Outputs (8)

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