Nodes/ComfyUI-GaussianArrowNav/Preview Gaussian (Arrow Nav)
ComfyUI Node

Preview Gaussian (Arrow Nav)

Gaussian splats deserve keyboard controls — this preview node finally adds them

By yic03685·Created 3 months ago·Updated 3 months ago· 0
Preview Gaussian (Arrow Nav)
  • extrinsics
  • intrinsics
    ply_path

    You generated a gaussian splat - from TripoSplat, a HunyuanWorld scene, a TRELLIS gaussian output, whatever - and now you have to actually look at it. Mouse-only orbit works until you want to hold a view steady, nudge it a degree at a time, or check a capture from one specific angle. That's the entire pitch of Preview Gaussian (Arrow Nav): it's GeometryPack's "Preview Gaussian" node with arrow-key navigation bolted on, and nothing else changed.

    This is the node you reach for when a splat is the destination, not a waypoint. The KB's 3D generation essay makes the call clearly: for a viewer or a rendered shot of a whole scene, gaussian splatting is the better representation and you shouldn't force it into a mesh. So the .ply lands on disk, and you need an inspection tool that isn't annoying. This is that tool.

    Same inputs, same engine, plus keys

    It's a self-contained clone of GeometryPack's GeomPackPreviewGaussian - same custom socket types, same gsplat.js viewer, same category (geompack/visualization). The important part: GeometryPack does not need to be installed. The pack vendors its own copy of the viewer and the gsplat bundle from the comfy-3d-viewers package, specifically so it doesn't depend on GeometryPack's startup file-copy step (which overwrites shared files). The whole thing is GPL-3.0 code adapted from upstream; this is an independent package, not a fork.

    The mechanism is the clever bit

    The Python side is deliberately boring: a thin node that resolves your ply_path, checks the file exists, and hands the frontend a relative path plus the file size and any camera you supplied. All the real work is in the browser. The viewer runs gsplat.js's OrbitControls, and the arrow-key navigation doesn't reimplement any orbit math - it translates each held key, once per animation frame, into the exact wheel and mouse-drag events OrbitControls already handles. So dampening, zoom clamping, and general feel are identical to dragging the mouse. The viewer grabs keyboard focus when you hover or click it, and lets it go when the pointer leaves, so your arrows don't accidentally drive the ComfyUI graph instead of the splat.

    The controls, once the viewer has focus:

    • ↑ / ↓ zoom in/out · ← / → orbit horizontally
    • PageUp / PageDown tilt (vertical orbit) · Shift + ↑/↓ same thing
    • W / A / S / D pan
    • Mouse wheel and left/right drag still work exactly as before

    The inputs that matter

    • ply_path (required) - a path to the splat's .ply. It's forceInput, so you either wire a string from another node or right-click the socket and convert it to a widget to type a path.
    • extrinsics (optional, EXTRINSICS) - a 4×4 camera pose that sets the initial view. Wire it from a GeometryPack camera node and the splat opens already facing the way you want.
    • intrinsics (optional, INTRINSICS) - a 3×3 intrinsics matrix for FOV/aspect; the node even resizes itself to match the image aspect ratio.

    There are no outputs - it's a terminal preview node. Below the viewer you get an info panel showing the file name, size in MB, and a key legend, and the viewer has screenshot and copy-to-clipboard buttons.

    Installing it

    No Python dependencies, no model downloads - the splat is already a file on your disk. Either grab it via ComfyUI Manager (search "ComfyUI-GaussianArrowNav") or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/yic03685/ComfyUI-GaussianArrowNav
    

    Then restart ComfyUI. That's genuinely the whole install; there's no requirements.txt to fight.

    Where people get burned

    Mostly the path. If the node's info panel goes red with File not found: <path>, you gave it a path that doesn't exist - the node refuses to render rather than silently blanking. Worth knowing: the frontend builds its load URL by parsing output/input/temp out of the path, and falls back to just the basename with type=output if it can't. So keep your .ply in the output folder and life is simple. And if the arrow keys do nothing, you're not hovering the viewer - it only listens when it has focus, which is by design, not a bug.

    Categorygeompack/visualization

    Inputs (3)

    NameTypeDefaultDescription
    ply_pathSTRING
    extrinsicsoptEXTRINSICS
    intrinsicsoptINTRINSICS

    Outputs (0)

    No outputs