Preview 360 Panorama
Check your equirectangular renders before you trust them
- images
If you've generated a 360° panorama - a skybox, an HDRI, a background plate for a LED volume - you already know the problem: a flat equirectangular image looks like nothing on its own. It's a stretched, distorted rectangle. The only way to actually judge it is to wrap it around a sphere and look out from the middle, the way it'll actually be used. That's the entire job of this node. You plug your image in, ComfyUI pops open an interactive viewer, and you drag around inside the sphere to check the thing that flat previews can't show you: does the left edge match the right edge, and do the poles (top and bottom) hold together without smearing into a mess.
It's a preview node, not a processing node - it doesn't transform your image at all. It's a terminal step you drop at the end of a branch to eyeball a result, same idea as a regular Preview Image node, just built for spherical content instead of flat ones.
Where it fits
This comes from ProGamerGov, who's been building out a small but genuinely useful 360° toolchain: pytorch360convert for converting between panorama formats, a video-frame generator for turning a still 360 into a rotating clip, and a standalone browser viewer that also works in VR headsets. He's also been training LoRAs (Qwen-based ones, at time of writing) specifically for generating 360° environments - so this viewer is the "does the generation actually work" check in that pipeline: generate with a 360 LoRA → preview here to catch seam breaks and pole artifacts → only then bother converting to HDRI or piping into Blender/a game engine. Skipping the preview step means you find out your seam is broken after you've built a scene around it.
The inputs that matter
There are only two, and that's by design:
images(IMAGE, required) - your equirectangular panorama. A standard 2:1 aspect-ratio image where the horizontal axis wraps around a full 360° and the vertical covers pole to pole.max_width(INT, default 4096) - caps the resolution the viewer loads at. The tooltip is blunt about the tradeoff: larger images get resized down, and bigger sizes run slower. Set it to-1to skip resizing entirely and view at full resolution - fine for a final check, but expect longer load times on a large panorama.
There's no output. is_output_node is true and the outputs list is empty - this node exists purely to render into the UI. Nothing downstream depends on it, so it's safe to leave dangling off any branch you want to inspect.
Once it's open, controls are simple: left-click and drag to pan/look around, scroll wheel to zoom.
Installing it
Easiest path is ComfyUI Manager - search "Preview 360 Panorama" (or paste the GitHub URL into the manual-install box) and let it handle the rest. There's also a comfy-cli registry install if you use that: comfy node registry-install comfyui-preview360panorama.
Doing it by hand, there's one detail worth flagging: clone with --recursive.
cd ComfyUI/custom_nodes
git clone https://github.com/ProGamerGov/ComfyUI_preview360panorama --recursive
python ComfyUI_preview360panorama/install.py
That flag matters because the viewer's 3D rendering leans on Three.js, and the recursive clone plus install.py is what pulls those files in for you. If you download the repo as a ZIP instead of cloning, you don't get that step for free - you have to manually grab three.core.min.js and three.module.min.js (from cdnjs or the mrdoob/three.js repo) and drop them into custom_nodes/ComfyUI_preview360panorama/js/lib yourself. Miss that and the node loads but the viewer has nothing to render with.
Restart ComfyUI after either path, and the node shows up under the pytorch360convert category in the node menu.
Common issues
The one real failure mode is the Three.js files being missing or mismatched - you'll get a node that appears in your graph but an empty or broken viewer panel when you run it. If that happens, check custom_nodes/ComfyUI_preview360panorama/js/lib actually has both .min.js files; a ZIP install is the usual culprit, since it skips the --recursive submodule pull that Git handles automatically.
Beyond that, it's mostly a performance dial. If the viewer feels sluggish or takes a while to open on a big image, that's max_width doing exactly what its tooltip says - drop it from the -1/full-resolution setting to something more modest like 2048 while you're just checking seams, and only go full-res for the final look. And remember this node only tells you if the panorama wraps cleanly - it won't fix a broken seam for you; that's the job of the companion pytorch360convert pack if you need to re-stitch or re-align the image first.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| max_width | INT | 4096 | The max width to use. Images larger than the specified value will be resized. Larger sizes may run slower. Set to -1 for no resizing. |
Outputs (0)
No outputs