Pixel Perfect Depth (Save Point Cloud - V2)
The point-cloud saver you should actually use (and why it's called Open3D)
- image
- ppd_depth
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(defaultscipy) - this is the important one.scipyruns the statistical outlier filter with a KD-tree and no Open3D dependency;open3duses the Open3D implementation if you really want it;noneskips filtering. Leave it onscipyunless 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 withfilter_method=scipythis 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.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| ppd_depth | PPD_DEPTH | — | |
| filename_prefix | STRING | ppd3d/PPD | — |
| apply_filter | BOOLEAN | true | — |
| use_fp16opt | BOOLEAN | true | — |
| save_glbopt | BOOLEAN | true | — |
| save_plyopt | BOOLEAN | true | — |
| moge_resolution_levelopt | INT | 91–9 | — |
| filter_methodopt | COMBO | scipy | 3 options: scipy, open3d, none |
| save_raw_depth_npyopt | BOOLEAN | false | — |
| save_depth_grayopt | BOOLEAN | false | — |
| save_depth_combinedopt | BOOLEAN | false | — |
Outputs (0)
No outputs