Nodes/camera-comfyUI/RenderSplats4DFrame
ComfyUI Node

RenderSplats4DFrame

Freezing a 4D splat scene at one moment in time

By Alexankharin·Created about a year ago·Updated about a month ago· 36
RenderSplats4DFrame
  • splats4d
  • camera_matrix
  • image
  • mask
  • disparity
camera_projection
camera_horizontal_fov90.00
time0.00
output_width512
output_height512
render_modeauto
max_splats0
deviceauto

A GSPLAT4D scene is a world plus time: canonical Gaussians whose positions and rotations are driven by track control-point motions, evaluated at any time value between 0 and 1. RenderSplats4DFrame is the node that picks a single moment - your chosen time - and renders the scene from a specific camera into an image, mask, and disparity map. It's the "still frame" half of the 4D render pair; its sibling RenderSplats4DVideo sweeps time and interpolates a camera path for you.

When do you reach for the frame version over the video? When you want control. You might be dialing in a shot: pick the camera matrix, pick the time where the motion looks best, render a single frame to check it before committing to a full sweep. Or you're compositing - render several frames at different times and stitch them yourself. Or you're building a contact sheet of the scene's motion. The video node does the mass production; this one does the art direction.

How it works

It takes the splats4d scene, evaluates it at time (0.0–1.0) - that's the at_time call that moves every canonical Gaussian along its track control points - and renders the resulting instantaneous cloud through a standard splat rasterizer with your camera_matrix (MAT_4X4), camera_projection, and camera_horizontal_fov. The render_mode selector (auto/gsplat/fast/over) picks the backend; auto uses gsplat's CUDA rasterizer when available, falling back otherwise. max_splats (0 = unlimited) caps how many Gaussians participate - handy for fast drafts.

The inputs you'll actually touch: splats4d, camera_matrix, time, camera_horizontal_fov, and output_width/output_height. The rest have sane defaults.

What comes out

  • image - [1,H,W,3] render.
  • mask - coverage, 1.0 where splats landed.
  • disparity - the depth cue, handy for compositing or as a control signal.

Where it fits

It's the end of the video-to-4D chain: BuildSplats4DRenderSplats4DFrame (or the video variant) → SaveImage. A single frame is cheap to render, so it's also the best node in the whole pack for debugging - if a 4D render looks wrong, start here before blaming the video renderer.

Installing it

Part of camera-comfyUI. Manager → Custom Nodes Manager → camera-comfyUI → Install → restart, or:

cd ComfyUI/custom_nodes
git clone https://github.com/Alexankharin/camera-comfyUI.git
cd camera-comfyUI && python install.py

Rendering wants gsplat for the fast path (installed by install.py), but it has pure-torch fallbacks, so it won't hard-fail without it.

Common issues

  • Frame looks empty - the camera matrix is outside the scene or pointing away from it; check the matrix convention (world-to-camera) and the fov.
  • Nothing moves with time - if the scene has no meaningful track data (or you loaded a scene saved without trajectories), all time values render nearly identically. That's a data problem, not a render problem.
  • Slow renders - no gsplat means the torch fallback. Re-run install.py to get the CUDA rasterizer.
CategoryCamera/GSplat4D

Inputs (10)

NameTypeDefaultDescription
splats4dGSPLAT4D
camera_matrixMAT_4X4
camera_projectionCOMBO3 options: PINHOLE, FISHEYE, EQUIRECTANGULAR
camera_horizontal_fovFLOAT90.001–360
timeFLOAT0.000–1
output_widthINT5128–16384
output_heightINT5128–16384
render_modeCOMBOauto4 options: auto, gsplat, fast, over
max_splatsINT00–100000000 = unlimited.
deviceoptCOMBOauto3 options: auto, cpu, cuda

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
disparityTENSOR