Nodes/ComfyUI-Sharp/SHARP Image + Attrs to PLY
ComfyUI Node

SHARP Image + Attrs to PLY

The save step for hand-edited gaussians

By PozzettiAndrea·Created 8 months ago·Updated 2 months ago· 358
SHARP Image + Attrs to PLY
  • gaussian_attrs
  • extrinsics
  • intrinsics
  • ply_path
  • extrinsics
  • intrinsics
output_prefixsharp_attrs
focal_length_px0

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 same SharpPredictGaussianAttrs call.
  • 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.

CategorySHARP

Inputs (5)

NameTypeDefaultDescription
gaussian_attrsMULTIBAND_IMAGE14-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.
extrinsicsEXTRINSICSPer-batch extrinsics matching the multiband batch (4×4 each). From SharpPredictGaussianAttrs.extrinsics.
intrinsicsINTRINSICSPer-batch intrinsics rescaled to the gaussian grid (3×3 or 4×4 pixel-K for H×W). From SharpPredictGaussianAttrs.intrinsics.
output_prefixoptSTRINGsharp_attrsBasename for the output PLY (single) or batch folder (N>1).
focal_length_pxoptFLOAT00–8192Override focal length in pixels saved into the PLY metadata. 0 = use intrinsics[0, 0] directly.

Outputs (3)

NameTypeDescription
ply_pathSTRING
extrinsicsEXTRINSICS
intrinsicsINTRINSICS