Sequence Frame
Pull one frame out of the splat sequence and hand it to ComfyUI's 3D nodes
- sequence
- splat
- model_3d
- count
A trained SplatKit sequence is 121 separate gaussian splats sitting in a folder. The other nodes in the family treat it as a movie: the player streams it, Sequence Preview renders it, Sequence Info counts it. This node does the opposite - it hands you one frame as a first-class splat object, so the rest of ComfyUI's 3D tooling can have it.
That matters more than it sounds. Splats are a representation, not a mesh, and the trade is real: they render photorealistically from any angle and are useless to a game engine or a printer without a conversion pass. So the interesting question is never "how do I play this" - that's the player's job - but "where can I actually take it", and core ComfyUI has the two doors that matter.
The two outputs
SplatKit_SequenceFrame reads ply/frame_NNNNN.ply with full spherical harmonics, so what you get isn't a flattened preview - it's the whole thing, view-dependent colour included.
splat(SPLAT) → Render Splat and Transform Splat, ComfyUI's core splat nodes. Render Splat gives you an image from a camera you control, which is how you get a still out of a splat without going through the preview renderer; Transform Splat is for moving or scaling the whole cloud.model_3d(FILE_3D_SPLAT_ANY) → Preview Splat and Save 3D Model. This is the "open it in a viewport and then write it to disk" path, for the eye test and for handing files to SuperSplat or Blender afterwards.countis the INT number of frames in the sequence, which is handy if you're drivingindexfrom a primitive node or looping.
Same data, two shapes, because ComfyUI's native 3D nodes take two different types for the same asset and there's no converter between them. SplatKit saves you the round trip.
The inputs
sequence from Train Sequence or Load Sequence. index picks the frame - and the tooltip deserves reading twice: "Position in the sequence, not the source frame number." If you exported frames 40–120 out of a generated clip, index 0 is source frame 40. There's no offsetting to do; the sequence is just a list and this indexes the list.
You can safely overshoot. Past the end, the node clamps to the last frame rather than erroring - convenient when a count-driven loop runs one iteration long, mildly annoying if you were expecting an error to tell you your maths was wrong.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/mickmumpitz/ComfyUI-SplatKit
python_embeded/python.exe -m pip install -r ComfyUI-SplatKit/requirements.txt
Restart, or ComfyUI Manager → search "ComfyUI-SplatKit". This node runs in ComfyUI's own Python and imports the core comfy_api.latest types, so it needs a reasonably current ComfyUI - the pack's optional video and 3D-adjacent nodes want 0.34 or newer. You still need the isolated backend to have produced the sequence, but reading a frame doesn't use it.
When it breaks
- "The sequence holds no .ply files." You pointed at a folder with no
ply/directory. Either it's not a sequence (a frameset hasframe_000/folders; a sequence hasply/andsplat/), or training died before it wrote any. - An index that gives you the wrong moment. Remember the clamping, and remember the indexing base. With a partial export,
index 0is not your clip's frame 0. - A blank viewport in Preview Splat. Usually framing, not data - a splat cloud has no bounding box hint, so an auto-framed camera that sits inside the gaussians renders nothing useful. Try Transform Splat to nudge scale, or render through Render Splat with an explicit camera.
- Everything feels slow after wiring this up. Full-SH
.plyfiles are not small, and core ComfyUI's splat rasterizer is doing real work per frame. Pull one or two frames rather than feeding this into a 121-iteration loop unless you mean it.
Where it earns its place in a real graph: stills from a sequence, a single frame exported to disk as a splat for someone else to open, or a frame handed to Transform Splat to check what a scale change does to the whole sequence before applying it across all of them.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| sequence | SPLATKIT_SEQUENCE | — | |
| index | INT | 00–100000 | Position in the sequence, not the source frame number. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| splat | SPLAT | — |
| model_3d | FILE_3D_SPLAT_ANY | — |
| count | INT | — |