Nodes/ComfyUI_HYWorld2/πŸ”οΈ WorldMirror 3D Reconstruction
ComfyUI Node

πŸ”οΈ WorldMirror 3D Reconstruction

Turn a single photo into an explorable 3D room with WorldMirror

By AHEKOTΒ·Created 4 months agoΒ·Updated about a month agoΒ· 74
πŸ”οΈ WorldMirror 3D Reconstruction
  • model
  • images
  • camera_intrinsics
  • camera_poses
  • ply_data
  • depth_maps
  • normal_maps
  • camera_poses
  • camera_intrinsics
  • raw_splats
β—„use_gsplattrueβ–Ί
β—„target_size518β–Ί
β—„offload_schemenoneβ–Ί
β—„stabilizationnoneβ–Ί
β—„confidence_percentile10β–Ί
β—„apply_sky_maskfalseβ–Ί
β—„filter_edgestrueβ–Ί
β—„edge_normal_threshold5.0β–Ί
β—„edge_depth_threshold0.030β–Ί
β—„mask_threshold0.50β–Ί
β—„use_direct_pointsfalseβ–Ί
β—„use_consensusfalseβ–Ί
β—„consensus_tolerance0.15β–Ί
β—„resolution_modeStandardβ–Ί

This is the node that makes the pack worth installing. Feed it a flat image - a room photo, a generated interior, one frame of a video - and VNCCS_WorldMirror3D hands back a PLY point cloud, depth and normal maps, camera poses, and a Gaussian splat of the scene. Same family of "give me a 3D world" that HunyuanWorld pitches, minus the hype: the author is upfront that HY-World 2.0 only shipped the splat-generation half, so think "explorable room", not "scripted video world".

You wire it right after a VNCCS_LoadWorldMirrorModel, pass your IMAGE, and leave use_gsplat on (that's the high-quality path; turning it off drops you to a bare point cloud). A single image is the happy path and it works well. A panorama is where this thing earns its keep - set use_consensus on and the voxel depth filter merges overlapping views and scrubs the ghosting that kills multi-view splats.

How it works

The model is Tencent's WorldMirror (it downloads from tencent/HunyuanWorld-Mirror automatically on first load). It predicts depth, normals, camera geometry, and confidence for your views, then either backprojects depth into points or, if you flip use_direct_points, uses the model's own pointmap head (PTS3D) instead. The latter skips the camera-distortion math entirely but leans on the model's internal geometry - the tooltip's way of saying "try it when depth projection makes a mess."

Most of the knobs exist because the default output is rough. mask_threshold is the one you'll actually touch: raise it to fix ghosting, lower it to fill holes. filter_edges + the two edge thresholds strip the flecks at object boundaries. apply_sky_mask is a trap unless you've separately installed onnxruntime and the skyseg.onnx model - leave it off otherwise.

The inputs that matter

  • images (required) - your IMAGE batch. One frame is fine; more views give better coverage.
  • use_gsplat (required) - splat output on by default.
  • use_consensus + consensus_tolerance - the panorama mode. Lower tolerance = tighter walls, more holes.
  • resolution_mode - Standard (single 518px pass), HD (multi-pass tiling to 1024), or Ultra (overlapping patches). Each step up costs real VRAM.
  • camera_poses / camera_intrinsics - optional, from the pack's Equirect360ToViews node. Required for correct geometry at high FOVs and for HD/Ultra patch alignment.

Outputs are ply_data (β†’ SavePLY or SplatRefiner), depth_maps and normal_maps (handy for feeding other nodes), camera_poses/camera_intrinsics, and raw_splats - the pre-refine splat blob that VNCCS_SplatRefiner eats.

Install and gotchas

Search HY-World 2.0 in ComfyUI 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

install.py builds the vendored gsplat_maskgaussian CUDA fork and installs it as gsplat. Do not install upstream gsplat from PyPI or the rasterizer errors out - the README is explicit that the project needs exactly one package named gsplat, the fork. Build tools needed: CUDA Toolkit matching your torch, ninja, and MSVC C++ Build Tools on Windows. The author tested on a 16 GB 5070 Ti; a 16 GB card runs the basic path, and the first load downloads the ~5 GB model. Expect rough edges - the release post literally opens with "the solution isn't very stable yet." That's the honest state of world-gen in ComfyUI: static scenes work, everything that has to rig or animate still doesn't.

CategoryVNCCS/3D

Inputs (18)

NameTypeDefaultDescription
modelWORLDMIRROR_MODELβ€”
imagesIMAGEβ€”
use_gsplatBOOLEANtrueEnable Gaussian Splatting renderer (High Quality). If disabled, falls back to Point Cloud.
target_sizeoptINT518252–1024β€”
offload_schemeoptCOMBOnone3 options: none, model_cpu_offload, sequential_cpu_offload
stabilizationoptCOMBOnone2 options: none, panorama_lock
confidence_percentileoptFLOAT100–100β€”
apply_sky_maskoptBOOLEANfalseRemove sky regions (requires onnxruntime and skyseg.onnx)
filter_edgesoptBOOLEANtrueRemove artifact points at object boundaries
edge_normal_thresholdoptFLOAT5.00.1–90β€”
edge_depth_thresholdoptFLOAT0.0300.001–0.5β€”
mask_thresholdoptFLOAT0.500–1Distortion Mask Threshold. 0.5 means discard anything beyond 50% weight. Increase to fix ghosting, decrease to fix holes.
use_direct_pointsoptBOOLEANfalseUse Direct Point Cloud Prediction (PTS3D) instead of Depth Projection. Bypasses camera distortion issues but relies on model's internal geometry.
use_consensusoptBOOLEANfalseEnable Consensus Merging (Voxel Depth Filter). High-quality mode that removes depth outliers and ghosting from overlapping views. Use for Panoramas.
consensus_toleranceoptFLOAT0.150.01–0.5Depth deviation threshold for consensus merging. Lower = tighter/cleaner walls, Higher = more forgiving.
resolution_modeoptCOMBOStandardStandard: Single-pass 518px. HD: Multi-pass tiling for 1024px backgrounds. Ultra: Overlapping patches for maximum detail.
camera_intrinsicsoptTENSOROptional: Intrinsics matrices from 'Equirect 360 to Views' node. REQUIRED for correct geometry at high FOVs.
camera_posesoptTENSOROptional: Extrinsic matrices (poses) from 'Equirect 360 to Views' node. REQUIRED for correct patch alignment in HD/Ultra modes.

Outputs (6)

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