Nodes/ComfyUI-pixel-perfect-depth/Pixel Perfect Depth (Save Point Cloud - V2)
ComfyUI Node

Pixel Perfect Depth (Save Point Cloud - V2)

The point-cloud saver you should actually use (and why it's called Open3D)

By Apache0ne·Created 8 months ago·Updated 8 months ago· 5
Pixel Perfect Depth (Save Point Cloud - V2)
  • image
  • ppd_depth
    filename_prefixppd3d/PPD
    apply_filtertrue
    use_fp16true
    save_glbtrue
    save_plytrue
    moge_resolution_level9
    filter_methodscipy
    save_raw_depth_npyfalse
    save_depth_grayfalse
    save_depth_combinedfalse

    Confusing naming alert: this is the V2 of the pack's point-cloud saver, and "Open3D" in its name is history, not destiny. It used to depend on the Open3D library to filter and export, and the author kept the old class name when the V2 rewrite landed. Which is good, because the whole point of the V2 is that Open3D itself is the thing to avoid - the README is blunt about it: Open3D can crash on file save in the newest ComfyUI, so the V2 node defaults to a scipy-based statistical filter instead. If you're building a fresh workflow with this pack, this is the save node to use, not the original PPDPointCloudSave.

    What it does

    Same core job as its predecessor: take an image plus the pack's ppd_depth payload, align the relative depth onto MoGe's metric geometry with a RANSAC fit, unproject to colored 3D points, and write GLB/PLY files. The differences are the parts that used to be fragile, plus debugging extras:

    • filter_method (default scipy) - this is the important one. scipy runs the statistical outlier filter with a KD-tree and no Open3D dependency; open3d uses the Open3D implementation if you really want it; none skips filtering. Leave it on scipy unless you have a reason - that's literally the author's recommendation.
    • save_raw_depth_npy, save_depth_gray, save_depth_combined - three optional debug exports: the raw depth array as .npy, a grayscale depth .png, and a side-by-side source-plus-colored-depth comparison image. All off by default; flip them on when you're diagnosing why a cloud came out wrong.

    Everything else mirrors the original: apply_filter, save_glb, save_ply, moge_resolution_level, filename_prefix (default ppd3d/PPD). Outputs go to ComfyUI/output/ppd3d/.

    Inputs worth knowing

    • image + ppd_depth - same image you generated depth from, plus its payload. The node resizes the depth to match MoGe's working resolution before the alignment step.
    • apply_filter (default on) - outlier removal; combined with filter_method=scipy this is the safe default.
    • moge_resolution_level (default 9) - MoGe quality/resolution; 9 is max. Drop it to 5–7 on low VRAM.
    • save_glb / save_ply - leave both on; GLB for Blender/game engines, PLY for point-cloud tools and printing.

    There's no point_stride or max_points in this version like the original has - the V2 thins points only through the filter, so on huge images the exported cloud can get big. Resize your input down if file size becomes a problem.

    Install

    Same pack, same recipe:

    cd ComfyUI/custom_nodes
    git clone https://github.com/Apache0ne/ComfyUI-pixel-perfect-depth
    cd ComfyUI-pixel-perfect-depth
    pip install -r requirements.txt
    

    Restart ComfyUI (Manager users: search ComfyUI-pixel-perfect-depth). Then the weights - remember, no auto-download in this pack:

    ComfyUI/models/ComfyUI-pixel-perfect-depth/
    ├── MoGe2/model.pt    (~1.3 GB)   ← required by this node
    └── DA2/  or  MoGe2/              ← depth weights from the depth-map node
    

    Troubleshooting

    The dominant failure is the same one that hits the original save node: FileNotFoundError for MoGe2/model.pt because nothing downloads itself in this pack. Drop that file in and the error goes away. The Open3D save-crash the V2 was designed around still exists if you deliberately switch filter_method to open3d - that's the point of the scipy default, so only change it if you know your environment handles it. On low VRAM, this node plus the diffusion depth model plus MoGe is a lot; lower moge_resolution_level first. And if the output cloud is full of stray floating points, apply_filter is your friend - turn it on if it's somehow off, and if the cloud is still noisy, filter in MeshLab or Blender afterwards. This is the node that actually ships the goods; give it the files it asks for and it's dependable.

    CategoryPixelPerfectDepth

    Inputs (12)

    NameTypeDefaultDescription
    imageIMAGE
    ppd_depthPPD_DEPTH
    filename_prefixSTRINGppd3d/PPD
    apply_filterBOOLEANtrue
    use_fp16optBOOLEANtrue
    save_glboptBOOLEANtrue
    save_plyoptBOOLEANtrue
    moge_resolution_leveloptINT91–9
    filter_methodoptCOMBOscipy3 options: scipy, open3d, none
    save_raw_depth_npyoptBOOLEANfalse
    save_depth_grayoptBOOLEANfalse
    save_depth_combinedoptBOOLEANfalse

    Outputs (0)

    No outputs