#define-ing FAST_COMPILE in PreProcess.h. However, this will make the compilation significantly slower.
G3
1 FLOAT
<RES_X> <RES_Y> <RES_Z>
<M_00> <M_01> <M_02> <M_03>
<M_10> <M_11> <M_12> <M_13>
<M_20> <M_21> <M_22> <M_23>
<M_30> <M_31> <M_22> <M_33>
The first two lines describe the contents of the file -- a 3D grid with a single floating point value per cell.x-, y-, and z-directions.<M> taking grid-space coordinates to world-coordinates.
<RES_X> x <RES_Y> x <RES_Z> bytes correspond to the (single precision) floating point values
of the implicit function.
#define-ed.
#define-ed.
<output header>.<client index>.ply.
G3
1 FLOAT
<RES_X> <RES_Y> <RES_Z>
<M_00> <M_01> <M_02> <M_03>
<M_10> <M_11> <M_12> <M_13>
<M_20> <M_21> <M_22> <M_23>
<M_30> <M_31> <M_22> <M_33>
The first two lines describe the contents of the file -- a 3D grid with a single floating point value per cell.x-, y-, and z-directions.<M> taking grid-space coordinates to world-coordinates.
<RES_X> x <RES_Y> x <RES_Z> bytes correspond to the (single precision) floating point values
of the implicit function.
G3
1 FLOAT
<RES_X> <RES_Y> <RES_Z>
<M_00> <M_01> <M_02> <M_03>
<M_10> <M_11> <M_12> <M_13>
<M_20> <M_21> <M_22> <M_23>
<M_30> <M_31> <M_22> <M_33>
The first two lines describe the contents of the file -- a 3D grid with a single floating point value per cell.x-, y-, and z-directions.<M> taking grid-space coordinates to world-coordinates.
<RES_X> x <RES_Y> x <RES_Z> bytes correspond to the (single precision) floating point values
of the implicit function.
G3
1 FLOAT
<RES_X> <RES_Y> <RES_Z>
<M_00> <M_01> <M_02> <M_03>
<M_10> <M_11> <M_12> <M_13>
<M_20> <M_21> <M_22> <M_23>
<M_30> <M_31> <M_22> <M_33>
The first two lines describe the contents of the file -- a 3D grid with a single floating point value per cell.x-, y-, and z-directions.<M> taking grid-space coordinates to world-coordinates.
<RES_X> x <RES_Y> x <RES_Z> bytes correspond to the (single precision) floating point values
of the implicit function.
Reconstructors.h and Extrapolator.h
Using the functionality requires requires choosing a finite element type and defining input oriented-point stream and output vertex and face streams. In the descriptions below, the template parameter Real is the floating point type used to represent data (typically float) and Dim is the integer dimension of the space (fixed at Dim=3).
FEMSig describes the 1D finite element type, which is a composite of the degree of the finite element and the boundary conditions it satisfies. Given an integer valued Degree and boundary type BType (one of BOUNDARY_FREE, BOUNDARY_DIRICHLET, and BOUNDARY_NEUMANN defined in BSplineData.h), the signature is defined as:
static const unsigned int FEMSig = FEMDegreeAndBType< Degree , BoundaryType >::Signature;
FEMSIgs describes the tensor-product finite element type, typically defined as an "isotropic" element with the same 1D finite element type across all Dim dimensions. It is defined as:
using FEMSigs = IsotropicUIntPack< Dim , FEMSig >;
PoissonRecon::Reconstructor is omitted for brevity.
InputSampleStream< Real , Dim > class.
The base class has two pure virtual methods that need to be over-ridden:
void reset( void ):bool read( Point< Real , Dim > &p , Point< Real , Dim > &n ):true if the read was successful and false if the read failed (i.e. the end of the stream was reached). The class Point< Real , Dim > represents a point in Dim-dimensional space, can be accessed like an array (i.e. overloads the bracked operator) and supports algebraic manipulation like addition and scalar multiplication.
OutputPolygonStream class.
The base class has two pure virtual methods that needs to be over-ridden:
size_t size( void ):size_t write( const std::vector< node_index_type > &polygon ):std::vector of integral indices. (The type node_index_type is an unsigned int if the BIG_DATA macro is not defined an unsigned long long if it is.) The function returns the index of the written polygon.
OutputVertexStream< Real , Dim > class.
The base class has two pure virtual methods that needs to be over-ridden:
size_t size( void ):size_t write( Point< Real , Dim > p , Point< Real , Dim > g , Real w ):p, as well as the gradient, g, and density weight, w if the extraction code is asked to compute those. The function returns the index of the written vertex.
Implict< Real , Dim , FEMSigs > object is created, encoding the implicit function describing the geometry, as well as a density function describing the distribution of points in space and (possibly) a function extrapolating per-sample information into a volumetric function. Then, the implicit function is iso-surfaced, (possibly) with auxialiary density and color information evaluated at the vertex positions.
Implict< Real , Dim , FEMSigs > *Poisson::Solver< Real , Dim , FEMSigs >::Solve( InputOrientedSampleStream< Real , Dim > &pointStream , SolutionParameters< Real > params ):pointStream) and a description of the reconstruction parameters (params) desribing the depth, number of samples per node, etc., and returns a pointer to the (dynamically allocated) implicit represetation (Reconstructors.h, line 622).
void Implicit< Real , Dim , FEMSigs >::extractLevelSet( OutputVertexStream< Real , Dim > &vStream , OutputFaceStream< Dim-1 > &pStream , LevelSetExtractionParameters meParams ):vStream) and polygon (pStream) streams and parameters for level-set extraction (meParams) and computes the extracted mesh, writing its vertices and faces into the corresponding output streams as they are generated (Reconstructors.h, line 548).
Implicit< Real , Dim , FEMSigs >::evaluator( void ):Implicit< Real , Dim , FEMSigs >::Evaluator. (Note that as the Implicit< Real , Dim , FEMSigs >::Evaluator object stores const references to the state in the Implicit< Real , Dim , FEMSigs > object, it will not be valid once the defining Implicit< Real , Dim , FEMSigs > object goes out of scope.)
Real Implicit< Real , Dim , FEMSigs >::Evaluator::operator()( Point< Real , Dim > ):Implicit< Real , Dim , FEMSigs >::Evaluator::OutOfUnitCubeException is thrown if it is outside of the unit-cube containing the input samples.
Point< Real , Dim > Implicit< Real , Dim , FEMSigs >::Evaluator::grad( Point< Real , Dim > ):Implicit< Real , Dim , FEMSigs >::Evaluator::OutOfUnitCubeException is thrown if it is outside of the unit-cube containing the input samples.
Extrapolator::Implicit< Real , Dim , AuxData , DataDegree >::Implicit( InputStream< Real , Dim , AuxData > &pointStream , Parameters params , AuxData zeroAuxData ):zeroAuxData is an object representing the zero-element of the auxiliary data.
AuxData Extrapolator::Implicit< Real , Dim , AuxData , DataDegree >::operator()( Point< Real , Dim > p ):Reconstruction.example.cpp code.
std::vector of std::vector< int >s is defined in lines 227-244 and constructed in line 403.
std::vector of Reals is desfined in lines 247-258 and constructed in line 404.
RGBColor type defined in lines 67-82). The auxiliary inform is derived in one of two ways:
Add method of the type trait PoissonRecon::Atomic<RGBColor> is specialized (lines 84-96) to define the atomic operation a += b.
% PoissonRecon --in horse.npts --out horse.ply --depth 10
or the SSD surface reconstructor
% SSDRecon --in horse.npts --out horse.ply --depth 10
% PoissonRecon --in bunny.points.ply --out bunny.ply --depth 10 --pointWeight 0
By default, the Poisson surface reconstructor uses degree-2 B-splines. A more efficient reconstruction can be obtained using degree-1 B-splines:
% PoissonRecon --in bunny.points.ply --out bunny.ply --depth 10 --pointWeight 0 --degree 1
(The SSD reconstructor requires B-splines of degree at least 2 since second derivatives are required to formulate the bi-Laplacian energy.)
% PoissonRecon --in eagle.points.ply --out eagle.pr.ply --depth 10
(with the RGBA color properties automatically detected from the .ply header).% SSDRecon --in eagle.points.ply --out eagle.ssd.ply --depth 10 --density
using the --density flag to indicate that density estimates should be output with the vertices of the mesh, and then calling:
% SurfaceTrimmer --in eagle.ssd.ply --out eagle.ssd.trimmed.ply --trim 7
to remove all subsets of the surface where the sampling density corresponds to a depth smaller than 7.% ChunkPly --in 1 eagle.ssd.trimmed.ply --out eagle.ssd.trimmed.chnks --width 4
which partitions the reconstruction into 11 pieces.
% PoissonRecon --in torso.points.ply --envelope torso.envelope.ply --out torso.pr.ply --depth 10
using the --envelope flag to specify the water-tight mesh constraining the reconstruction.<in dir> and that a networked temporary folder <temp dir> exists, a distributed reconstruction of the eagle over 4 clients at depth 10, outputting the reconstruction to eagle.ply (relative to the directory from the server is run), can be obtained by calling:
% PoissonReconServer --count 4 --depth 10 --in <in dir>/eagle.points.ply --tempDir <temp dir>/temp --out eagle.ply
(with the RGBA color properties automatically detected from the .ply header).Server Address: <IPv4 address>:<port>
The four clients can then be executed by connecting them to the server:
% PoissonReconClient --port <port> --address <IPv4 address>
% PoissonReconClient --port <port> --address <IPv4 address>
% PoissonReconClient --port <port> --address <IPv4 address>
% PoissonReconClient --port <port> --address <IPv4 address>
Alternatively, the four clients can be executed serially:
% PoissonReconClient --port <port> --address <IPv4 address> --multi 4
% PointInterpolant --inValues quadratic.2D.fitting.samples --tree quadratic.2D.tree --dim 2
Then, the reconstructed function can be evaluated at the evaluation samples by calling the adaptive tree visualization:
% AdaptiveTreeVisualization --in quadratic.2D.tree --samples quadratic.2D.evaluation.samples
This will output the evaluation positions and values:
0 0 1.33836e-05
0.5 0 0.25001
0.5 0.5 0.500006
2 2 nan
Note that because the (last) evaluation position (2,2) is outside the bounding box of the fitting samples, the function cannot be evaluated at this point and a value of "nan" is output.
% ImageSitching --in pixels.png labels.png --out out.png
% EDTInHeat --in horse.ply --out horse.edt --depth 9
Then, the visualization code can be used to extract iso-surfaces from the implicit function.% AdaptiveTreeVisualization.exe --in horse.edt --mesh horse_0.01_.ply --iso 0.01 --flip
(By default, the surface is aligned so that the outward facing normal aligns with the negative gradient. Hence, specifying the --flip flag is used to re-orient the surface.)% AdaptiveTreeVisualization.exe --in horse.edt --mesh horse_0.25_.ply --iso 0.25 --flip
(Since the default --scale is 2, a value of 0.25 should still give a surface that is contained within the bounding box.)% AdaptiveTreeVisualization.exe --in horse.edt --grid horse.grid
PoissonRecon and SSDRecon to support processing of 2D point sets.
PoissonRecon, SSDRecon, and AdaptiveTreeVisualization to support ouput to .jpg and .png image files.
DynamicFactory object is dynamically allocated and not only known at construction time.
Poisson and SSD to be classes for cleaner library interface in Reconstruction.example.cpp.
--width bug in estimating scale factor.
--width compatibility bug with default depth.
--exact bug.
ChunkPly bug.
--keepSeparate flag to PoissonReconServer to output non-fused geometry..
--width bug.
--kernelDepth bug that occured when the --width flag was used to set the reconstruction depth.
_mktemp.
_mktemp.
PoissonRecon namespace.
SANITIZED_PR.
NestedVector to reduce synchronization.
--evaluate flag to the Reconstruction.example executable that evaluates the implicit function at an interior/exterior/boundary point on the sphere.
--color flag of the Reconstruction.example executable to support evaluation of colors from the extrapolated field.
SufaceTrimmer executable.
Extrapolator.
Reconstruction.example to use parallelized extrapolation.
MK_ERROR_OUT with MK_THROW to throw an exception rather than exit directly.