WorldStereo Generate
Camera-guided video generation with WorldStereo
- model
- image
- trajectory
- base_camera_poses
- base_camera_intrinsics
- video_frames
- camera_poses
- camera_intrinsics
Take one image, hand the camera a path, and this node generates the frames that path would have seen - including the bits of the scene that were hidden behind the sofa, which it hallucinates. That's the whole job. You get a video out, plus camera poses and intrinsics that line up with every frame. Wire those back into VNCCS_WorldMirrorV2_3D and the WorldMirror splat gets the occluded geometry filled in, turning a flat photo into something you can orbit. Or just keep the video.
How it works
It's a three-part pipeline, and it's worth knowing because it explains the VRAM story:
- MoGe - Microsoft's monocular geometry model - estimates a point map from your source image (the same model the
moge.jsonpanel covers; it's auto-downloaded on first load). - The source view is rendered into the target camera poses from your trajectory, so each new frame starts from real geometry.
- WorldStereo - a Wan 2.1 14B image-to-video diffusers pipeline - inpaints/generates the occluded and unseen regions in every slice. A prompt guides what it invents there.
The generate node loops over your input batch (each panorama slice), caching the T5 prompt embeds, CLIP image embeds, and VAE latents across slices so you're not re-encoding the same conditioning for every view.
The inputs that matter
- model - from
VNCCS_LoadWorldStereoModelor, almost always,VNCCS_LoadWorldStereoLightModel. The full base model is around 100GB and the author says outright it wants an unreasonable amount of VRAM. Hisint4Light models (fromMIUProject/VNCCS_WorldStereoLight) are roughly 8GB and are the sensible default for most people. - image - your source. A single photo, or a batch of views (e.g. slices from
VNCCS_Equirect360ToViews). - trajectory - a
CAMERA_TRAJECTORYfromVNCCS_CameraTrajectoryBuilder. Presets likecircular,stereo_orbit,forward,zoom_in,left_right,aerial- the builder also lets you paste your own 4×4 c2w matrices as JSON if you want a specific path. - prompt - text guiding the inpainting of occluded parts. Empty works, but describing "what's behind the camera" helps the hallucination.
- num_inference_steps - 0 = auto (4 steps with a turbo LoRA or the DMD model, 20 otherwise).
- guidance_scale - default 5, but forced to 1.0 automatically when a turbo LoRA is loaded.
- seed - -1 for random.
The VRAM-minded ones: cache_conditioning (on by default), latent_condition_mode / render_vae_mode / conditioning_frame_mode (all auto, which switch to first-frame/keyframes at high resolution), and vae_memory_mode (diffusers VAE tiling/slicing).
Outputs
Three: video_frames (IMAGE - preview it, save it, or feed it to WorldMirror V2), camera_poses and camera_intrinsics (TENSOR - these are what you connect to VNCCS_WorldMirrorV2_3D's camera inputs so the reconstruction uses the exact cameras that generated the frames).
Install
The pack's normal install applies - 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
On top of the vendored gsplat fork build (the usual CUDA-toolkit + ninja + MSVC requirement), WorldStereo needs PyTorch3D (installed by install.py), MoGe (pulled from the Microsoft repo by requirements), and the model itself. The Light node downloads the int4 transformer, the UMT5 encoder, and the Wan VAE automatically.
Gotchas
- Use the Light model unless you have a GPU farm. The author built the int4 variants because the base WorldStereo is 100GB. Start there.
- Turbo LoRA changes the rules. Load one and
guidance_scaleis forced to 1.0 and steps drop to 4 - that's not a bug, it's how Wan turbo LoRAs behave. - Some presets auto-crop.
stereo_orbitandforward_orbitturn on edge cropping automatically (the generated borders get cropped so the intrinsics stay honest). You'll seecrop_generated_edgesflip. - Set expectations on the reconstruction path. The author is candid that the generated frames tend to make the final WorldMirror reconstruction worse rather than better unless you're generating at ~1024×1024 - which is hard on modest VRAM. It's genuinely still experimental, which is exactly why it's a separate node.
- Swapped inputs are auto-detected. If you cross
base_camera_posesandbase_camera_intrinsics, it warns and swaps them back - but it's still worth wiring them in the right order the first time.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| model | WORLDSTEREO_MODEL | — | |
| image | IMAGE | — | |
| trajectory | CAMERA_TRAJECTORY | — | |
| promptopt | STRING | Text prompt to guide the inpainting/generation of occluded parts. | |
| num_inference_stepsopt | INT | 00–100 | 0 = auto (4 for turbo LoRA or memory-dmd, 20 for others). |
| guidance_scaleopt | FLOAT | 5.01–20 | Forced to 1.0 automatically when a turbo LoRA is loaded. |
| seedopt | INT | -1-1–2147483647 | -1 = random. |
| negative_promptopt | STRING | — | |
| cache_conditioningopt | BOOLEAN | true | Cache T5 prompt embeds, CLIP image embeds, and VAE latent conditioning across slices. |
| latent_condition_modeopt | COMBO | auto | auto uses first_frame_only at high resolutions to reduce VAE encode VRAM. |
| render_vae_modeopt | COMBO | auto | auto encodes keyframe render conditioning at high resolutions to reduce VAE encode VRAM. |
| conditioning_frame_modeopt | COMBO | auto | auto renders only keyframe conditioning when render_vae_mode uses keyframes. |
| vae_memory_modeopt | COMBO | auto | Enable diffusers VAE tiling/slicing when available to reduce high-resolution VAE VRAM. |
| crop_generated_edgesopt | BOOLEAN | false | Crop generated borders from every output frame and adjust intrinsics. |
| worldmirror_sequence_modeopt | COMBO | stereo_only | prepend_source_highres outputs the original high-res source view first, followed by generated frames resized to that source size. |
| generated_upscale_modeopt | COMBO | bicubic | Upscaler used when prepend_source_highres needs generated video frames resized to the source image resolution. |
| seedvr2_seedopt | INT | 420–4294967295 | SeedVR2 seed used only when generated_upscale_mode=seedvr2. |
| seedvr2_resolutionopt | INT | 00–16384 | 0 = use the source image short edge for SeedVR2 resolution. |
| seedvr2_max_resolutionopt | INT | 00–16384 | 0 = use the source image long edge as SeedVR2 max_resolution. |
| video_view_filteropt | COMBO | all_views | zero_pitch_only runs WorldStereo video only for near-horizontal panorama views; other views pass through as high-res anchors. |
| edge_crop_percentopt | FLOAT | 8.00–30 | Percent to crop from each side when crop_generated_edges is enabled. |
| base_camera_posesopt | TENSOR | — | |
| base_camera_intrinsicsopt | TENSOR | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video_frames | IMAGE | — |
| camera_poses | TENSOR | — |
| camera_intrinsics | TENSOR | — |