Fisheye Projection Only
Project a perspective frame into a fisheye view for a second outpaint pass
- images
- fisheye_images
- info
This is the sibling of Fisheye Lens Warp Only, and the difference between the two is the whole story. Lens Warp bends pixels in place - same frame, more curvature. This node instead reprojects your frame into a square fisheye-shaped view: it builds a fresh square output canvas and maps your perspective image onto it like it's a scene captured by a fisheye lens. Different output shape, different job.
It's the "Projection" node for the pack's second-pass step. The Muffins pipeline works like this: outpaint a flat frame onto a panoramic canvas, then run a pass to make the result look like it came from a real lens before the final VR conversion. FisheyeProjectionOnly is the version you reach for when you want the output to be an actual square fisheye frame - the classic circular image with the horizon line curved through the middle - rather than just a warped version of what you had.
How it works
The mechanism is the standard perspective-to-fisheye projection. The node builds a grid of view directions across the square output canvas, applies your rotation, then shoots those directions back through a pinhole camera model of your input image: vfov sets the field of view, and the vertical FOV plus image height determines the effective focal length. Pixels that land outside the input image are handled by fill_mode.
The two fill_mode choices matter more than they look:
edge(default) - outside-lens pixels are clamped to the nearest edge pixel. No black padding gets baked in, so a downstream outpaint has something plausible to extend from rather than a hard black ring.black- classic black circle around the fisheye. Pick this if you genuinely want the black padding to be part of the output.
Inputs you'll actually touch
vfov(default 100) - how much of the scene the fisheye captures. Higher = wider.rollandpitch- rotate the view before projecting. Handy when your source horizon isn't level.fill_mode- the edge-vs-black choice above.use_input_size/output_side- square output size. Withuse_input_sizeon (default), the side is derived from your input's longest dimension; turn it off to setoutput_sideexplicitly (1024 default, up to 16384).
Everything else - center_x, center_y, lens_radius - that Lens Warp carries isn't here, because this node isn't pretending to be one specific lens; it's just projecting. The output is fisheye_images (the square IMAGE batch) plus an info string summarizing the projection parameters.
Install
Same pack, same trivial setup - requirements.txt is just numpy, no models to fetch. ComfyUI Manager: search "Muffins-Flat-2-Panoramic-node". Or:
cd ComfyUI/custom_nodes
git clone https://github.com/Ragamuffin20/Muffins-Flat-2-Panoramic-node.git
cd Muffins-Flat-2-Panoramic-node
python -m pip install -r requirements.txt
Restart ComfyUI and it shows up under video/utils.
The one thing to remember
If your input is already a square fisheye image, don't run it through this node - you'd be re-projecting something already projected. This is for perspective/rectilinear source frames that need to become fisheye. And if all you want is mild curvature on a frame you're keeping square, Fisheye Lens Warp Only is the lighter touch; reach for this one when you want the honest square-fisheye frame to feed the final VR conversion.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| roll | FLOAT | 0.00-180–180 | — |
| pitch | FLOAT | 0.00-89.9–89.9 | — |
| vfov | FLOAT | 100.001–179 | — |
| use_input_size | BOOLEAN | true | — |
| output_side | INT | 1024256–16384 | — |
| fill_mode | COMBO | edge | 2 options: edge, black |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| fisheye_images | IMAGE | — |
| info | STRING | — |