Screened Poisson Surface Reconstruction (Version 7.0)

links executables usage changes

Papers: SGP 2006, ToG 2013
Executables (Win32, Win64)
Source Code GitHub Repository
(Older Versions: V6.13a, V6.13, V6.12, V6.11, V6.1, V6, V5.71, V5.6, V5.5a, V5.1, V5, V4.51, V4.5, V4, V3, V2, V1)


For testing purposes, three point sets are provided:
  1. Eagle: A set of 796,825 oriented point samples with color (represented in PLY format) was obtained in the EPFL Scanning 3D Statues from Photos course.
    Unscreened Screened Screened + Color Screened + Color + Trimmed
  2. Bunny: A set of 362,271 oriented point samples (represented in PLY format) was obtained by merging the data from the original Stanford Bunny range scans. The orientation of the sample points was estimated using the connectivity information within individual range scans.
    The surface of the model can be reconstructed by calling the surface reconstructor as follows:
    % PoissonRecon --in bunny.points.ply --out bunny.ply --depth 10
  3. Horse: A set of 100,000 oriented point samples (represented in ASCII format) was obtained by sampling a virtual horse model with a sampling density proportional to curvature, giving a set of non-uniformly distributed points.
    The surface of the model can be reconstructed by calling the surface reconstructor as follows:
    % PoissonRecon --in horse.npts --out horse.ply --depth 10
To convert the binary PLY format to Hugues Hoppe's ASCII mesh format, a Perl script is provided.
As an examples, the reconstructed bunny can be converted into the ASCII mesh format as follows:
% bunny.ply > bunny.m

Version 3:
  1. The implementation of the --samplesPerNode parameter has been modified so that a value of "1" more closely corresponds to a distribution with one sample per leaf node.
  2. The code has been modified to support compilation under MSVC 2010 and the associated solution and project files are now provided. (Due to a bug in the Visual Studios compiler, this required modifying the implementation of some of the bit-shifting operators.)
Version 4:
  1. The code supports screened reconstruction, with interpolation weight specified through the --pointWeight parameter.
  2. The code has been implemented to support parallel processing, with the number of threads used for parallelization specified by the --threads parameter.
  3. The input point set can now also be in PLY format, and the file-type is determined by the extension, so that the --binary flag is now obsolete.
  4. At depths coarser than the one specified by the value --minDepth the octree is no longer adaptive but rather complete, simplifying the prolongation operator.
Version 4.5:
  1. The algorithmic complexity of the solver was reduced from log-linear to linear.
Version 4.51:
  1. Smart pointers were added to ensure that memory accesses were in bounds.
Version 5:
  1. The --density flag was added to the reconstructor to output the estimated depth of the iso-vertices.
  2. The SurfaceTrimmer executable was added to support trimming off the subset of the reconstructed surface that are far away from the input samples, thereby allowing for the generation of non-water-tight surface.
Version 5.1:
  1. Minor bug-fix to address incorrect neighborhood estimation in the octree finalization.
Version 5.5a:
  1. Modified to support depths greater than 14. (Should work up to 18 or 19 now.)
  2. Improved speed and memory performance by removing the construction of integral and value tables.
  3. Fixed a bug in Version 5.5 that used memory and took more time without doing anything useful.
Version 5.6:
  1. Added the --normalWeight flag to support setting a point's interpolation weight in proportion to the magnitude of its normal.
Version 5.7:
  1. Modified the setting of the constraints, replacing the map/reduce implementation with OpenMP atomics to reduce memory usage.
  2. Fixed bugs that caused numerical overflow when processing large point clouds on multi-core machines.
  3. Improved efficiency of the iso-surface extraction phse.
Version 5.71:
  1. Added the function GetSolutionValue to support the evaluation of the implicit function at a specific point.
Version 6:
  1. Modified the solver to use Gauss-Seidel relaxation instead of conjugate-gradients at finer resolution.
  2. Re-ordered the implementation of the solver so that only a windowed subset of the matrix is in memory at any time, thereby reducing the memory usage during the solver phase.
  3. Separated the storage of the data associated with the octree nodes from the topology.
Version 6.1:
  1. Re-ordered the implementation of the iso-surface extraction so that only a windowed subset of the octree is in memory at any time, thereby reducing the memory usage during the extracted phase.
Version 6.11:
  1. Fixed a bug that created a crash in the evaluation phase when --pointWeight is set zero.
Version 6.12:
  1. Removed the OpenMP firstprivate directive as it seemed to cause trouble under Linux compilations.
Version 6.13:
  1. Added a MemoryPointStream class in PointStream.inl to support in-memory point clouds.
  2. Modified the signature of Octree::SetTree in MultiGridOctreeData.h to take in a pointer to an object of type PointStream rather than a file-name.
Version 6.13a:
  1. Modified the signature of Octree::SetIsoSurface to rerun a void. [cloudcompare]
  2. Added a definition of SetIsoVertexValue supporting double precision vertices. [cloudcompare]
  3. Removed Time.[h/cpp] from the repository. [cloudcompare/asmaloney]
  4. Fixed assignment bug in Octree::SetSliceIsoVertices. [asmaloney]
  5. Fixed initialization bug in SortedTreeNodes::SliceTableData and SortedTreeNodes::XSliceTableData. [asmaloney]
  6. Included stdlib.h in Geometry.h. [asmaloney]
  7. Fixed default value bug in declaration of Octree::SetTree. [asmaloney]
Version 7.0:
  1. Added functionality to support color extrapolation if present in the input.
  2. Modified a bug with the way in which sample contributions were scaled.