Nodes/Comfyui-Qwen-Image-2.1-MultiAngle-T8/AnyAngleReconstructionOutputT8
ComfyUI Node

AnyAngleReconstructionOutputT8

The mystery node in your graph that's turning your photo into gaussians

By T8mars·Created 24 days ago·Updated 3 days ago· 85
AnyAngleReconstructionOutputT8
  • splat
  • samples
  • reference
  • prepared
  • mask
    ◄keep_backgroundfalse►

    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 native SPLAT already 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 samples LATENT. 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_bytes helper and stored in ComfyUI/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.
    CategoryT8/AnyAngle/internal

    Inputs (6)

    NameTypeDefaultDescription
    splatSPLAT—
    samplesLATENT—
    referenceIMAGE—
    preparedIMAGE—
    maskMASK—
    keep_backgroundoptBOOLEANfalse—

    Outputs (0)

    No outputs