AnyAngleReconstructionOutputT8
The mystery node in your graph that's turning your photo into gaussians
- splat
- samples
- reference
- prepared
- mask
If you queue a graph and see this node run in the middle of a stack you didn't build, nothing is broken. AnyAngleReconstructionOutputT8 is the terminal node of the TripoSplat reconstruction graph that AnyAngle Studio submits to ComfyUI's /prompt endpoint behind your back when you click "rebuild from the original image." Its category is T8/AnyAngle/internal, its name ends in "Output", and it has no outputs at all.
What it's for
The interactive workbench needs a 3D representation it can orbit. The pack's answer is a gaussian splat - millions of little oriented blobs that render photorealistically from any angle, which is exactly the representation the 3D world uses for novel-view rendering - rendered by a WebGL viewer in the browser. This node is the bridge: it takes the native ComfyUI TripoSplat pipeline's output, does the bookkeeping a viewer needs, and writes the splat to disk as a Gaussian PLY.
It's also the only way the browser learns the job finished. Because it's an output node that returns an empty tuple, its actual return value is a UI payload - a JSON descriptor with the gaussian count, bounding box, camera token, crop rectangle and asset names. The workbench polls /history/<prompt_id>, scrapes that payload out, and starts rendering.
How it works
The interesting part is the massage it applies to a raw TripoSplat decode:
- Trimming. It reads the valid gaussian count, errors out with "TripoSplat splat contains no valid gaussians" if there is none, and drops any gaussian whose opacity is at or below 0.1 - the viewer doesn't want faded haze.
- Axis fix. It multiplies positions by
[1, -1, -1]. The nativeSPLATalready carries the exporter's axis transform, so this is the one flip needed to land +Y up. - Framing. Bounds come from the 0.5th and 99.5th percentiles of positions, not min/max, so a handful of stray points can't blow out the initial camera distance.
- The camera token. This is why the node takes a
samplesLATENT. It pulls the 5-float camera token out of the second latent in the batch and validates it. That token is the camera the reconstruction was rendered from - which is how the workbench knows that 0° corresponds to the model's prediction of your original photo's angle. - Crop. It upscales your mask, erodes it, takes the centroid of what's left, and derives a square crop. That's what the viewer centres on, and why a subject in the corner of a wide photo still fills the viewport.
- Writing. The splat is encoded as a binary little-endian Gaussian PLY by ComfyUI's own
_gaussian_ply_byteshelper and stored inComfyUI/input/anyangle_studio/, named after a SHA-256 of the descriptor. Same inputs twice, no duplicate write.
Inputs, and the one optional flag
Five required inputs, all of them things the reconstruction graph already has lying around: splat from VAEDecodeTripoSplat, samples from the KSampler (the camera token rides here - don't substitute some other latent), reference from your Load Image, prepared from TripoSplatPreprocessImage, and mask from the BiRefNet background removal. keep_background (BOOLEAN, default false) records that you ran the experimental whole-frame mode: the browser-side graph swaps BiRefNet for a solid white mask and simply doesn't build the background-removal nodes, so there's no extra model to install - the flag exists so the saved source is labelled, and so AnyAngle Studio switches base-model prompts to the scene-wide variant.
Outputs: none. There is no IMAGE or SPLAT socket to wire anywhere. If you want the splat for something other than this workbench, use ComfyUI's own gaussian-splat nodes.
Installing it
No separate install - it ships with the pack (T8mars/Comfyui-Qwen-Image-2.1-MultiAngle-T8), and it needs the five TripoSplat files that python install_reconstruction.py fetches: triposplat_fp16.safetensors in diffusion_models/, birefnet.safetensors in background_removal/, dino_v3_vit_h.safetensors in clip_vision/, and the two VAEs in vae/. Skip that script and this node never gets the chance to run.
Gotchas
- Nothing appears after a reconstruction. Usually you've skipped
install_reconstruction.py, or the five files sit in subfolders with names the auto-detection can't match. The workbench's "rebuild model" panel lets you pick each of the five roles by hand and save the choice in that browser. - "TripoSplat foreground mask is empty." A full-body subject on a busy background where BiRefNet found nothing to cut. Pick an image with an obvious subject, or try the keep-background experimental mode.
- Your splats are invisible to the next person. They live in
ComfyUI/input/anyangle_studio/, so migrating a workflow means copying that folder too. - Don't hand-edit it. If it's in your graph, the workbench built that graph (its node ids are sequential, 1 through 12) and it's already committed to ComfyUI's queue. Rebuilding from the workbench is the supported path.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| splat | SPLAT | — | |
| samples | LATENT | — | |
| reference | IMAGE | — | |
| prepared | IMAGE | — | |
| mask | MASK | — | |
| keep_backgroundopt | BOOLEAN | false | — |
Outputs (0)
No outputs