π SBS VR Panorama by SamSeen
Make stereoscopic 360Β° panoramas you can actually watch in a Quest
- panorama_image
- vr_panorama
- depth_panorama
This is the node for the "whoa" demo: you feed it a flat 360Β° panorama and it hands back a stereoscopic version that looks genuinely 3D when you view it in a VR headset. Same core trick as the rest of this pack - estimate depth, then shift pixels differently for each eye - but tuned specifically for equirectangular panoramas, which have some nasty special cases that a flat-image node would mangle.
It's the single most impressive node in the ComfyUI_SSStereoscope pack, and also the one with the strictest input requirements. Understand those and it's remarkably one-shot.
The mechanism
Equirectangular panoramas (2:1 images, 360Β° horizontally) need a different approach than flat photos, because the image wraps around. The node runs a depth model over the panorama, then - unlike the flat nodes - applies a horizontal displacement that wraps at the edges (cv2.remap with BORDER_WRAP and cubic interpolation). Left and right eye views are generated by shifting each column by an amount derived from the depth value, scaled down near the top and bottom poles, where naive shifting would create distortion. Large panoramas get split into overlapping tiles for the depth pass and feathered back together, so you don't blow up VRAM on an 8K source. It even post-processes the depth with a bilateral filter and a sqrt curve to keep the 3D from looking like flat "cardboard" layers.
If the depth model fails to load, it falls back to a gradient depth map - you'll get some 3D, but not meaningful 3D. That fallback is a warning sign, not a feature.
The inputs
All five matter, but in different ways:
panorama_image- must be equirectangular, 2:1 aspect. A normal photo won't work; you need an actual 360Β° image (generated with SD + outpainting, or stitched from a camera).depth_scale(default 10, range 1β20) - stereo separation intensity. The tooltip says it straight: start at 10 for noticeable depth, and reduce it if it's uncomfortable in VR. This is the first knob you'll fight with.ipd_mm(default 65) - your interpupillary distance in millimeters. Average adult is 62β68mm; unless you know yours is off, leave it.format-over_under(default) orside_by_side. Over-under is what Quest/Meta headsets expect, so if you're on a Quest just keep it.invert_depth- defaults totruehere, unlike the pack's other nodes. Depth models genuinely do often hand back inverted depth, so the author flips it by default. If your scene looks near/far reversed, toggle this.
The outputs
vr_panorama(IMAGE) - the stereo result, in your chosen format. Save it and view it in a VR player.depth_panorama(IMAGE) - the estimated depth, useful for debugging or as input to other tools.
Install
Same pack as everything else. ComfyUI Manager β search "ComfyUI_SSStereoscope", or:
cd ComfyUI/custom_nodes
git clone https://github.com/MrSamSeen/ComfyUI_SSStereoscope
cd ComfyUI_SSStereoscope
pip install -r requirements.txt
Restart, refresh, done. The Depth-Anything model downloads automatically on first run (V2 Small by default), so the very first execution needs an internet connection and a minute of patience.
Gotchas worth knowing
The common failure mode is feeding it a flat image and getting garbage - there's no way to make a stereo panorama from a normal photo, so don't fight that. The second is cranking depth_scale to the max and getting a headache-inducing mess; the node's whole design is calibrated for comfortable viewing, and the "start at 10" guidance is there for a reason. Third: it's CPU-bound for the shift step and the first run downloads a model, so don't judge performance by the first frame. For the "print this, watch in Quest" demo, generate a clean 2:1 equirect, drop it in, and leave ipd_mm and format alone.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| panorama_image | IMAGE | Input 360Β° panoramic image in equirectangular format (2:1 aspect ratio) | |
| depth_scale | FLOAT | 10.01β20 | Controls stereo separation intensity. Start at 10 for noticeable depth, reduce if uncomfortable in VR. |
| ipd_mm | FLOAT | 6550β80 | Interpupillary distance in millimeters. Average adult: 62-68mm. |
| format | COMBO | over_under | VR output format. Over-under recommended for Quest/Meta headsets. |
| invert_depth | BOOLEAN | true | Reverse depth perception. Usually needed since depth models often produce inverted depth. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| vr_panorama | IMAGE | β |
| depth_panorama | IMAGE | β |