Reconstruct Surface
Point cloud to mesh in one dropdown — Poisson, ball pivoting, alpha shape, or hull
- points
- reconstructed_mesh
- info
You've got a pile of points and no surface. Photogrammetry output, a depth map you turned into a cloud, a mesh someone flattened into vertices - whatever. Reconstruct Surface is the GeometryPack node that wraps it in plastic: pick an algorithm from a dropdown and out comes a real triangle mesh. This is the frontend node you actually drop on the canvas; the four (backend) nodes it dispatches to are hidden from the normal palette.
Why you'd reach for it: surface reconstruction is the bridge from "I have data" to "I have something I can remesh, unwrap, or 3D-print." The pack's own framing is that ComfyUI can become a serious 3D platform, and this is one of the load-bearing nodes in that pitch. Most workflows here chain into it from a point-cloud generator and out into a geometry viewer or an exporter.
How it works
Under the hood it's ComfyUI's node expansion: the backend dropdown is a DynamicCombo, and when you pick an option the node's GraphBuilder spawns a hidden backend node (GeomPackReconstruct_Poisson, _BallPivoting, _AlphaShape, or _ConvexHull) with the matching parameters. Each backend runs in its own isolated environment, which is why a "lightweight" node can pull in Open3D, PyMeshLab, or scipy depending on what you pick.
The inputs that matter
- points (TRIMESH) - your point cloud. You can also feed it a full mesh; it just reads the vertices.
- backend - the dropdown. This is the whole point. Select it and the right parameters appear:
- poisson - smooth, watertight output. Your go-to for printing or anything that needs a closed surface.
poisson_depth,poisson_scale,estimate_normals,normal_radius. - ball_pivoting - keeps fine detail but tends to leave holes.
ball_radius,estimate_normals,normal_radius. - alpha_shape - controllable detail, good for non-convex shapes that aren't too noisy. Just
alpha. - convex_hull - fast and rough; loses every concavity. No parameters.
- poisson - smooth, watertight output. Your go-to for printing or anything that needs a closed surface.
Both outputs come out of the same node: reconstructed_mesh (TRIMESH) and info (STRING), a text report with input/output counts and whether the result is watertight. Wire the mesh into any GeometryPack consumer, a 3D viewer, or a save node; the info string feeds a Show Text node if you want the stats on screen.
Installing GeometryPack
ComfyUI Manager, search GeometryPack, install the highest version (nightly if the stable one won't resolve). Or the manual route, which the author calls most reliable:
cd ComfyUI/custom_nodes
git clone https://github.com/PozzettiAndrea/ComfyUI-GeometryPack.git
cd ComfyUI-GeometryPack
pip install -r requirements.txt --upgrade
python install.py
Restart ComfyUI after. Don't skip that python install.py - it's the pack's comfy-env one-click installer, which pulls in the pixi package manager and builds the isolated environments the heavy backends (Open3D, PyMeshLab, Blender, CGAL) actually run in. First run after install can download a lot.
Gotchas
- Backend nodes are marked dev-only. If a workflow references
GeomPackReconstruct_Poissondirectly it still works, but the supported path is this frontend node. - This pack moves fast and the author's own warning is "occasional breakage." If a saved workflow throws a validation error like "could not convert string to float: 'true'", it's almost always a stale workflow carrying parameters from a different backend. Delete the node, re-add it, and pick the backend again. This is the single most common complaint about the pack on r/comfyui, and it's usually this simple to dodge.
- If you're not sure which backend fits, Poisson at default depth 8 is the safe first try - watertight, and the auto normal estimation fixes bad inputs.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| points | TRIMESH | — | |
| backend | COMBO | Reconstruction algorithm. poisson=smooth watertight, ball_pivoting=preserves detail, alpha_shape=controllable detail, convex_hull=fast rough |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| reconstructed_mesh | TRIMESH | — |
| info | STRING | — |