4DAnyone Generate Views
One video in, 32 camera angles out (this is the expensive one)
- models
- video
- views
- result_dir
Here's the problem this node solves. One person, one camera, one clip. A gaussian splat trainer needs many viewpoints of the same instant to work out where anything is in 3D - and you only ever filmed from one place. So this node invents the rest: it takes your video and returns N synchronized videos of the same motion, shot from N camera positions on one or two rings around the subject. Same body, same timing, angles you never had.
That's the trick: video → generated views → frameset → a splat per frame, rather than the mesh-and-texture route image-to-3D normally takes. You're not reconstructing geometry, you're sampling a moving subject from enough directions that a per-frame splat falls out.
How it works
The generator runs in SplatKit's isolated backend, but two things happen here in ComfyUI first.
It probes the clip and warns loudly if the input breaks the contract 4DAnyone was trained on: portrait 9:16, at least 720p on the short side, at least 121 frames (about 5 seconds at 24fps - shorter clips get the last frame held to fill up). Then it runs SAM 3D Body locally to estimate the body pose: the conditioning signal that keeps 32 separately-generated angles depicting the same person in the same pose rather than 32 unrelated hallucinations. The pose is keyed to the canonical clip - the frames your start_time, target_fps and num_frames select - not to the source file, so re-cropping a video doesn't reuse a stale pose.
Then the backend denoises the views. A finished result is cached per (clip content, settings, seed) and reused instantly, so iterating on the export side costs nothing extra. Change a setting and you pay again: the run label is a hash of the lot.
The inputs that matter
Connect models from 4DAnyone Model Loader and give it a clip via video (from Load Video) or video_path (which overrides the input when set).
camera_preset is the real decision: 16 views on one ring for a quick test, 24 on one ring as the upstream default, 32 views, 2 rings - full body as the pack's default, 48 for the best result, and an upper-body preset for talking heads. custom unlocks views_per_ring (divisible by 4 or 6) and ring_pitches. Generation time scales with total views - 48 is not 1.5x the cost of 32, it's 1.5x the denoising plus more to keep coherent.
turbo is on by default and you should probably leave it: it's a distilled 4-step profile with a fused adapter and matching view routing, which the author describes as reconstructing as cleanly as the 24-step base model at a fifth of the denoising time. Turning it off means base model, 24 steps, and you need the Turbo LoRA selected in the loader with turbo on, or generation refuses.
Beyond that: seed (don't change it casually mid-project - same clip, settings and seed means the same views), attention (sage is faster if SageAttention is installed in the backend), low_vram for tiled VAE decoding on a shared GPU, and num_frames, which must be 4k+1 - 121 by default, because that's what the model was trained on.
Outputs are views (the bundle Export Frameset and Load View want) and result_dir, the folder on disk where the generated videos landed.
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
Then the part people skip: the generator does not run in ComfyUI's Python. Download the installer bundle from the pack's GitHub Releases page, drop installer.bat into the custom node folder, run it once, restart, and queue a Splat Backend Setup node to confirm it's ready. Windows x64 with an NVIDIA GPU and ComfyUI 0.34+ is the supported combination.
Weights are manual and there are a lot of them: the 4DAnyone checkpoint, Wan2.2_VAE.pth, prompt_context.safetensors and the rank-64 Turbo LoRA in models/splatkit/4danyone/; BiRefNet's four files in models/splatkit/birefnet/; SAM 3D Body in models/detection/. Refresh ComfyUI's model lists after copying them in, or the loader enums stay empty.
When it breaks
- Roughly 24GB VRAM is what generation wants, per the pack's own docs, and lower-memory cards aren't validated. Both processes share the card, so close your other ComfyUI models - the node unloads them for you, but it can't unload another app.
- Non-portrait or short clips generate anyway, with warnings in the console, and it'll look worse - the pack says so. Run 4DAnyone Validate Input first. Five seconds against an hour of GPU is a good trade.
- Two people in frame is fatal and nothing can detect it. One person, staying roughly in place, mild camera motion. Fast hands and loose clothing still produce inconsistent views after all the conditioning.
- "4D backend required" means the isolated environment isn't installed or has gone stale after an update - rerun the installer (
--rebuildforces a replacement). - A short export range does not make this node faster. Generating views is the cost; you can't skip it by exporting 20 frames instead of 120.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| models | SPLATKIT_4DANYONE_MODELS | From 4DAnyone Model Loader. All weights must already be installed. | |
| camera_preset | COMBO | 32 views, 2 rings - full body (default) | How many angles to invent and at what height. Time scales with the view count. 'custom' uses views_per_ring and ring_pitches. |
| seed | INT | 420–2147483647 | — |
| turbo | BOOLEAN | true | The distilled 4-step profile (fused adapter plus matching view routing). Reconstructs as cleanly as the 24-step base model at a fifth of the denoising time. Off = base model, 24 steps. |
| videoopt | VIDEO | From Load Video. | |
| video_pathopt | STRING | Overrides the VIDEO input when set. | |
| attentionopt | COMBO | sdpa | Attention backend inside the generator. sage is faster when SageAttention is installed in the backend. |
| low_vramopt | BOOLEAN | false | Tiled VAE decoding. Lowers the decode spike on cards that share the GPU with something else. |
| views_per_ringopt | INT | 164–48 | custom preset only; divisible by 4 or 6. |
| ring_pitchesopt | STRING | 15,35 | custom preset only; degrees, each in -15..45. |
| start_yawopt | INT | 0-180–180 | Yaw of the first view; 0 faces the person. |
| yaw_spanopt | INT | 3601–360 | Yaw range per ring; 360 is a full orbit. |
| start_timeopt | FLOAT | 0.00–10000 | Seconds into the clip to start. |
| target_fpsopt | STRING | auto | — |
| num_framesopt | INT | 12133–121 | Clip length (4k+1). The model was trained at 121; shorter is for quick tests. |
| views_per_groupopt | COMBO | auto | 3 options: auto, 4, 6 |
| enable_rcpopt | BOOLEAN | true | — |
| enable_tcropt | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| views | SPLATKIT_4DANYONE_VIEWS | — |
| result_dir | STRING | — |