PointcloudTrajectoryEnricher
Filling in what a camera move exposes, in one node
- pointcloud
- trajectory
- enriched_pointcloud
- debug_image
- debug_depth
Here's the problem this node solves: you built a point cloud from a single image, and the moment you move the camera more than a few degrees, you hit holes - the parts of the scene your source image never saw. The pack's answer is to outpaint those holes with a generative model, estimate depth on the filled pixels, and lift the whole thing back into 3D so the cloud grows into a walkable scene. PointcloudTrajectoryEnricher wraps that entire loop into a single node that you just point at a cloud and a trajectory.
It's the one-node version of the pack's pointcloud_inpaint.json workflow, and it's a genuinely impressive amount of machinery in a box: for each pose along the trajectory it projects the current cloud, Flux-inpaints the uncovered regions, runs metric depth estimation, backprojects the filled pixels to 3D, transforms them into world space, cleans, and merges the new points into the running cloud. By the end, a cloud that only knew one viewpoint has been taught the rest of the room.
What it does under the hood
Internally it chains the pack's own nodes: ProjectPointCloud to see the view, OutpaintAnyProjection (Flux inpainting) to fill holes, DepthEstimatorNode (Depth-Anything V2 metric) for geometry, ZDepthToRayDepthNode to fix the depth convention, DepthToPointCloud to lift, TransformPointCloud to place, and PointCloudCleaner to keep the additions tidy. The default model_name is Depth-Anything-V2-Metric-Indoor-Base-hf, which you can swap for another Depth-Anything V2 variant.
The inputs that matter
- pointcloud - your
N×7starting cloud. - trajectory - the
[K,4,4]camera path to visit; each pose gets one enrich pass. - camera_type / horizontal_fov / width / height - how each view is rendered.
- patch_projection / patch_res / patch_phi / patch_theta - where the outpaint patch is aimed, same language as
OutpaintAnyProjection. - prompt - what the inpainter should draw in the holes. A good prompt matters; the model fills open space, so describe the scene's content, not "fill hole."
- num_inference_steps (default 50), guidance_scale (default 7.5), mask_blur - the Flux inpainting knobs.
- voxel_size / min_points_per_voxel - cleanup settings for the added points.
- model_name - the depth model.
Three outputs: enriched_pointcloud (the grown cloud), debug_image, and debug_depth - the latter two are the last processed view, which are worth wiring up just so you can see what's happening while it churns.
What it costs
Reality check: this is a slow, heavy node. Every pose on the trajectory runs a Flux inpainting pass plus a depth-estimation pass. That means it needs the inpainting_flux sibling pack (installed automatically by install.py) and a Depth-Anything V2 model download on first use, and each pass is seconds-to-minutes on a decent GPU. The code caps at 15 trajectory poses per run, which is generous enough to be genuinely slow.
Installing it
It's in camera-comfyUI. Manager → Custom Nodes Manager → camera-comfyUI → Install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Alexankharin/camera-comfyUI.git
cd camera-comfyUI && python install.py
Make sure install.py completed (it clones the Flux inpainting pack); re-run it if OutpaintAnyProjection reports a missing import.
Common issues
- Hole-filling looks like gray mush - your prompt is too weak or the patch misses the hole; tune
patch_phi/patch_thetaand describe the scene content. - Model download on first run - Depth-Anything V2 downloads automatically; allow network and a few minutes.
- Slow - no, really slow - expected. Cut the trajectory to fewer poses, drop
patch_res, or reducenum_inference_steps.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| pointcloud | TENSOR | — | |
| trajectory | TENSOR | — | |
| camera_type | COMBO | 3 options: PINHOLE, FISHEYE, EQUIRECTANGULAR | |
| horizontal_fov | FLOAT | 90.00 | — |
| width | INT | 512 | — |
| height | INT | 512 | — |
| patch_projection | COMBO | 3 options: PINHOLE, FISHEYE, EQUIRECTANGULAR | |
| patch_horiz_fov | FLOAT | 90.00 | — |
| patch_res | INT | 512 | — |
| patch_phi | FLOAT | 0.00 | — |
| patch_theta | FLOAT | 0.00 | — |
| prompt | STRING | — | |
| num_inference_steps | INT | 50 | — |
| guidance_scale | FLOAT | 7.50 | — |
| mask_blur | INT | 5 | — |
| voxel_size | FLOAT | 0.07 | — |
| min_points_per_voxel | INT | 3 | — |
| model_name | STRING | Depth-Anything-V2-Metric-Indoor-Base-hf | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| enriched_pointcloud | TENSOR | — |
| debug_image | IMAGE | — |
| debug_depth | TENSOR | — |