Nodes/comfyui_gaussian_splat/Gaussian Viewer Select
ComfyUI Node

Gaussian Viewer Select

Steer a 3D scene like a camera rig — and export the exact pose

By supart·Created 7 months ago·Updated 5 months ago· 19
Gaussian Viewer Select
  • extrinsics
  • intrinsics
  • image
  • camera_panel
  • width
  • height
  • azimuth
  • elevation
  • zoom
  • camera_description
  • camera_6dof
ply_path
width1024
height576
modeAlways Pause
backgroundblack
point_size1.5

If you've ever trained or loaded a 3D Gaussian Splat - a .ply from image-to-3D generation or a photogrammetry run - you've hit the wall that there's no good way to look at it inside ComfyUI and, more importantly, no way to turn "I want a shot from over there" into numbers your graph can use. Most gaussian viewers in Comfy are bolted to a specific reconstruction pipeline and are useless as input. This one is different: it's a real interactive viewer that renders the splat in your browser, and when you stop orbiting it hands you a screenshot plus the exact camera pose that produced it. That last part is the whole point.

The pitch, in one line: load a .ply, fly around it with WASD, hit confirm, and out come the image and the pose - azimuth, elevation, zoom, a human-readable camera description, and a 6DoF string - ready to wire into something that conditions on camera language.

How it works

ply_path is the only input that matters to get started (it's a string field, so feed it a file path). The node reads the PLY with plyfile, decodes the spherical-harmonic colors, sigmoids the opacity, exponentiates the scales, normalizes the quaternions, and ships it to a browser-side gsplat bundle. No CUDA gsplat extension to build - that's the trick of this pack, and it's why you won't spend an afternoon fighting compilers. The real rendering happens in the browser canvas.

Then the node blocks. In the default mode, Always Pause, it sends a show event to the frontend and waits (up to 10 minutes) for you to confirm a camera in the viewer. Whatever you see is captured as a screenshot, composited onto your chosen background (black/white/gray), and returned alongside the pose. Cancel the run and it raises instead of hanging your queue. If it times out - say you queued it and walked off - you get a solid-color fallback image with default pose values, so the graph doesn't die.

The pose outputs are the payload you actually care about:

  • azimuth, elevation, zoom - floats you can feed into math or another node
  • camera_description - text like "front view, eye level, medium shot (horizontal: 0, vertical: 0, zoom: 5.0)"
  • camera_6dof - a JSON string with x/y/z/pitch/yaw/roll, in relative-transform, integer-ish style that plays nice with camera-conditioned prompting

camera_panel is a second image showing the viewer's own UI chrome - handy if you want a record of the rig, mostly noise otherwise. width/height just echo what you rendered at.

The few inputs that matter

  • mode - Always Pause is interactive; Pass Through skips the viewer entirely, renders a fallback, and returns default pose. Use Pass Through when you're testing or automating and don't want the queue to stop.
  • point_size (default 1.5) - how fat the splats look. Crank it if your scene looks sparse.
  • width/height - the output screenshot size, up to 4096.
  • extrinsics/intrinsics (optional) - if another node gives you a camera matrix, it seeds the viewer's starting orientation. Nice for round-tripping a pose you already have.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/supart/comfyui_gaussian_splat
cd comfyui_gaussian_splat
pip install -r requirements.txt

Then restart ComfyUI and hard-reload the browser tab. Or just search comfyui_gaussian_splat in ComfyUI Manager. Dependencies are refreshingly light - numpy, torch, plyfile, Pillow - because the heavy lifting happens in-browser, not in a Python renderer.

Where people get burned

The interactive mode only makes sense when a human is at the browser. Batch-run a workflow that still says Always Pause and every job stalls for the 10-minute timeout before falling back. Flip to Pass Through for anything headless.

Pose caching is keyed per node and per PLY path - if you swap the input PLY, the saved camera resets, which is correct but can look like a bug if you expected continuity. If the frontend looks stale after an update, the README's advice is blunt: clear the browser cache once.

Also don't expect a magic volume render. It's gaussian splats, rendered as points - quality depends on the source PLY, not the node. Feed it a good 3DGS file and this is genuinely the most comfortable way to fly around a scene in ComfyUI and pull a camera out of it.

Category3D/Gaussian

Inputs (8)

NameTypeDefaultDescription
ply_pathSTRING
widthINT102464–4096
heightINT57664–4096
modeCOMBOAlways Pause2 options: Always Pause, Pass Through
backgroundCOMBOblack3 options: black, white, gray
point_sizeFLOAT1.50.1–10
extrinsicsoptEXTRINSICS
intrinsicsoptINTRINSICS

Outputs (9)

NameTypeDescription
imageIMAGE
camera_panelIMAGE
widthINT
heightINT
azimuthFLOAT
elevationFLOAT
zoomFLOAT
camera_descriptionSTRING
camera_6dofSTRING