Screened Poisson Surface Reconstruction (Version 4.51)

Outdated version -- see latest version at

links executable usage changes

ToG 2013 Paper SGP 2006 Paper
Executables (Win32, Win64)
Source Code
(Older Versions: Version 4.5 Page Version 4 Page Version 3 Page Version 2 Page Version 1 Page)


For testing purposes, two oriented point sets are provided:
  1. 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 original Poisson Reconstruction algorithm can be invoked by calling:
    % PoissonRecon --in bunny.points.ply --out bunny.unscreened.ply --depth 10 --pointWeight 0
    using the --pointWeight 0 argument to disable the screening.
    By default, screening is enabled so the call:
    % PoissonRecon --in bunny.points.ply --out bunny.screened.ply --depth 10
    produces a reconstruction that more faithfully fits the input point positions.
  2. 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.