Panorama Camera View
Drag a virtual camera through your 360° panorama
- panorama
- perspective_view
An equirectangular panorama is a weird thing to look at directly - a flat 2:1 image where the whole world is squashed onto one canvas. What you actually want, most of the time, is a normal-looking camera frame pointing at some part of that world. That's exactly what Panorama Camera View (the DreamEquirectToPerspective node) does: it renders a rectilinear perspective view from any direction inside your 360° image. You pick a direction, it hands you a flat photo-like frame.
It's the node you reach for when you want to turn a generated or photographed panorama into something you can feed to img2img, grab a thumbnail, or pull a clean reference frame out of a scene. It's the static, bake-it-into-a-png sibling of the pack's interactive WebGL viewer - same projection math, but you get a real IMAGE you can wire anywhere.
How it works
The mechanism is old-school computer graphics, done deterministically on CPU with numpy. For every output pixel it builds a ray, rotates that ray by your yaw/pitch/roll, converts the result to longitude/latitude, and bilinear-samples the source panorama (wrapping horizontally so the world is seamless). There's no model, no network call, no GPU involved - run it a thousand times and you get the same frame every time. That determinism makes it safe to batch: render a sweep of frames and animate them.
The inputs that matter
- yaw (−180…180) - look left and right around the horizon. Animating this is how you do a virtual camera pan or turntable sweep.
- pitch (−89…89) - look up and down. Note the clamp: you can't stare straight at the poles, which is a sensible guard because equirectangular tops and bottoms are heavily compressed.
- field_of_view (20…150, default 80) - your lens. Low values zoom in like a telephoto, high values get wide and bendy. The default reads like a normal-ish camera lens.
- width / height (128…4096, step 64, default 1024×768) - output size. Keep these in the source image's ballpark; the projection only reuses existing pixels, it doesn't invent detail.
The output is a single IMAGE called perspective_view - wire it into a Preview, a Save Image, an img2img pass, or whatever else eats an image.
Installing it
Install the whole pack once (all seven nodes come together):
cd ComfyUI/custom_nodes
git clone https://github.com/gokayfem/ComfyUI-Dream-Interpreter.git
python -m pip install -r requirements.txt
Restart ComfyUI. Or just use ComfyUI Manager and search for ComfyUI-Dream-Interpreter. The only Python dependencies are numpy and Pillow - no model downloads, no API keys, nothing to fetch. The node appears under panorama/dream toolkit.
Where people get burned
The biggest trap is feeding it a panorama that isn't a real 2:1 equirect. If the image is the wrong shape or the horizon is tilted, your "camera view" looks wrong in ways the projection can't fix - it faithfully shows whatever was in the source. Run the pack's Validate Dream Panorama node upstream and Repair Panorama Seam if the seam energy is high. And remember the poles: pitch near ±89 and low source resolution will smear and blur, because there simply isn't much data up there. If your view looks mushy, the fix isn't more zoom - it's a higher-resolution source panorama.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| panorama | IMAGE | — | |
| yaw | FLOAT | 0-180–180 | — |
| pitch | FLOAT | 0-89–89 | — |
| roll | FLOAT | 0-180–180 | — |
| field_of_view | FLOAT | 8020–150 | — |
| width | INT | 1024128–4096 | — |
| height | INT | 768128–4096 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| perspective_view | IMAGE | — |