ποΈ WorldMirror 3D Reconstruction
Turn a single photo into an explorable 3D room with WorldMirror
- model
- images
- camera_intrinsics
- camera_poses
- ply_data
- depth_maps
- normal_maps
- camera_poses
- camera_intrinsics
- raw_splats
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) - yourIMAGEbatch. 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), orUltra(overlapping patches). Each step up costs real VRAM.camera_poses/camera_intrinsics- optional, from the pack'sEquirect360ToViewsnode. 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.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| model | WORLDMIRROR_MODEL | β | |
| images | IMAGE | β | |
| use_gsplat | BOOLEAN | true | Enable Gaussian Splatting renderer (High Quality). If disabled, falls back to Point Cloud. |
| target_sizeopt | INT | 518252β1024 | β |
| offload_schemeopt | COMBO | none | 3 options: none, model_cpu_offload, sequential_cpu_offload |
| stabilizationopt | COMBO | none | 2 options: none, panorama_lock |
| confidence_percentileopt | FLOAT | 100β100 | β |
| apply_sky_maskopt | BOOLEAN | false | Remove sky regions (requires onnxruntime and skyseg.onnx) |
| filter_edgesopt | BOOLEAN | true | Remove artifact points at object boundaries |
| edge_normal_thresholdopt | FLOAT | 5.00.1β90 | β |
| edge_depth_thresholdopt | FLOAT | 0.0300.001β0.5 | β |
| mask_thresholdopt | FLOAT | 0.500β1 | Distortion Mask Threshold. 0.5 means discard anything beyond 50% weight. Increase to fix ghosting, decrease to fix holes. |
| use_direct_pointsopt | BOOLEAN | false | Use Direct Point Cloud Prediction (PTS3D) instead of Depth Projection. Bypasses camera distortion issues but relies on model's internal geometry. |
| use_consensusopt | BOOLEAN | false | Enable Consensus Merging (Voxel Depth Filter). High-quality mode that removes depth outliers and ghosting from overlapping views. Use for Panoramas. |
| consensus_toleranceopt | FLOAT | 0.150.01β0.5 | Depth deviation threshold for consensus merging. Lower = tighter/cleaner walls, Higher = more forgiving. |
| resolution_modeopt | COMBO | Standard | Standard: Single-pass 518px. HD: Multi-pass tiling for 1024px backgrounds. Ultra: Overlapping patches for maximum detail. |
| camera_intrinsicsopt | TENSOR | Optional: Intrinsics matrices from 'Equirect 360 to Views' node. REQUIRED for correct geometry at high FOVs. | |
| camera_posesopt | TENSOR | Optional: Extrinsic matrices (poses) from 'Equirect 360 to Views' node. REQUIRED for correct patch alignment in HD/Ultra modes. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| ply_data | PLY_DATA | β |
| depth_maps | IMAGE | β |
| normal_maps | IMAGE | β |
| camera_poses | TENSOR | β |
| camera_intrinsics | TENSOR | β |
| raw_splats | VNCCS_SPLAT | β |