RenderSplats4DFrame
Freezing a 4D splat scene at one moment in time
- splats4d
- camera_matrix
- image
- mask
- disparity
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: BuildSplats4D → RenderSplats4DFrame (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.pyto get the CUDA rasterizer.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| splats4d | GSPLAT4D | — | |
| camera_matrix | MAT_4X4 | — | |
| camera_projection | COMBO | 3 options: PINHOLE, FISHEYE, EQUIRECTANGULAR | |
| camera_horizontal_fov | FLOAT | 90.001–360 | — |
| time | FLOAT | 0.000–1 | — |
| output_width | INT | 5128–16384 | — |
| output_height | INT | 5128–16384 | — |
| render_mode | COMBO | auto | 4 options: auto, gsplat, fast, over |
| max_splats | INT | 00–10000000 | 0 = unlimited. |
| deviceopt | COMBO | auto | 3 options: auto, cpu, cuda |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| disparity | TENSOR | — |