SHARP Image + Attrs to PLY
The save step for hand-edited gaussians
- gaussian_attrs
- extrinsics
- intrinsics
- ply_path
- extrinsics
- intrinsics
SharpPredict does prediction and saving in one node. SharpPredictGaussianAttrs splits that apart deliberately - it gives you raw Gaussian data you can mask or filter before committing anything to disk. This node is the other half of that split: it's the actual save step, taking the raw attribute tensor and camera matrices and writing them out as a real .ply file you can open in a viewer.
How it works
It reads a 14-channel packed tensor - position (xyz), scale (xyz), rotation as a quaternion (wxyz), color (rgb), and opacity, in that order, per the node's own description - and writes it to PLY using the paired camera matrices to place everything correctly in space. In practice, you'll almost always be feeding it first_layer_gaussian_attrs or second_layer_gaussian_attrs straight from SharpPredictGaussianAttrs, likely after you've masked out unwanted Gaussians upstream.
The inputs and outputs that matter
- gaussian_attrs (required,
MULTIBAND_IMAGE) - the packed 14-channel tensor. - extrinsics / intrinsics (required) - must match the batch that produced
gaussian_attrs; from the sameSharpPredictGaussianAttrscall. - output_prefix (optional, default
sharp_attrs) - filename base, or folder name if you're saving a batch. - focal_length_px (optional, default 0) - override the focal length written into the PLY's own metadata. 0 means "use
intrinsics[0,0]directly," which is the sane default unless you have a specific reason to write a different value into the file.
Outputs: ply_path, extrinsics, intrinsics - the same camera matrices pass straight through, ready to chain into MergeGaussians or a viewer.
Installing it
Manager: search "Sharp," install highest (try nightly if that build misbehaves). Or Manager → Git URL: https://github.com/PozzettiAndrea/ComfyUI-Sharp.git. Manual: clone, pip install -r requirements.txt --upgrade, python install.py, restart.
Viewing the result inside ComfyUI needs ComfyUI-GeometryPack installed separately - its PreviewGaussian node isn't part of this pack.
Common issues
The obvious footgun is a batch mismatch between gaussian_attrs and extrinsics/intrinsics - nothing in the node suggests it auto-broadcasts a single camera across a batch of Gaussians, so keep them paired from the exact same upstream SharpPredictGaussianAttrs call rather than mixing and matching.
If you only wire in first_layer_gaussian_attrs (or only second_layer_gaussian_attrs), you get a single-surface PLY - functionally the same trade-off SharpPredictForeground's mode makes automatically in one step. That's a deliberate option, not a mistake, if you specifically want just the front or just the back surface for some downstream purpose.
If the result looks broken or invisible in the built-in preview, that's consistent with reports on Apple Silicon/MPS where the file itself is fine but the in-graph viewer isn't - check it in superspl.at/editor before assuming the PLY is corrupted.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| gaussian_attrs | MULTIBAND_IMAGE | 14-channel multiband (samples [B, 14, H, W]) with channel order position_xyz, scale_xyz, quat_wxyz, color_rgb, opacity. Typically the first_layer_gaussian_attrs or second_layer_gaussian_attrs output of SharpPredictGaussianAttrs. | |
| extrinsics | EXTRINSICS | Per-batch extrinsics matching the multiband batch (4×4 each). From SharpPredictGaussianAttrs.extrinsics. | |
| intrinsics | INTRINSICS | Per-batch intrinsics rescaled to the gaussian grid (3×3 or 4×4 pixel-K for H×W). From SharpPredictGaussianAttrs.intrinsics. | |
| output_prefixopt | STRING | sharp_attrs | Basename for the output PLY (single) or batch folder (N>1). |
| focal_length_pxopt | FLOAT | 00–8192 | Override focal length in pixels saved into the PLY metadata. 0 = use intrinsics[0, 0] directly. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| ply_path | STRING | — |
| extrinsics | EXTRINSICS | — |
| intrinsics | INTRINSICS | — |