To give a quick idea of how to perform surface reconstruction with our tools, I will give an example of how Armadillo Man can be converted from a Wavefront obj file to our pts fromat, and then reconstructed.
> ObjToPts armadilloman.obj > WaveletPipeRecon pts armadilloman.pts depth 7\ wavelet daub4 stream f load_plane t load_points t
> ObjToPts armadilloman.obj > SortPoints armadilloman.pts > WaveletPipeRecon pts armadilloman.pts depth 7\ wavelet daub4 stream t to_screen f
To get a list of possible parameters, run the program with no parameters.
> WaveletPipeRecon.exe Parameters can be passed to the command line by first giving the name of the parameter to modify followed by its value. pts [.pts] depth [N] wavelet (haar|daub4) to_screen (t|f) to_file (t|f) prune (t|f) blur (t|f) pts_node (t|f) above_below (t|f) eval_pass (t|f) stream (t|f) surf_at_pts (t|f) fill_in_mem (t|f) stay_open (t|f) load_plane (t|f) load_points (t|f) cfg [config_file]
In all cases, the parameter you want to set is followed by the value the parameter should be set to.
The point file to be processed should be given. If streaming is enabled, the point file must be sorted. Sorting can be performed by the SortPoints program. If streaming is not enabled, the input file does not need to be sorted. There are several tools to convert from different formats to our pts format, but if no tool exists to convert the input you are using, the pts files are simple to generate.
The pts format has a simple header followed by a list of all the points. Using C-like notation, the format is as follows:
struct xyz { float x, y, z; }; struct bbox { xyz min_corner, max_corner; }; struct header { bbox bounds; int number_of_points; }; struct point { xyz normal, position; }; struct pts_file { header head; point points[]; };
Depth specifies the maximum number of discrete function values on an edge of the bounding box that can be generated. The number of cells on a side is 2^depth.
Either daub4 or haar can be specified for the Daubechies 4 or Haar wavelets respectively.
If to_screen is true, then an OpenGL context will be created and all of the output triangles will be stored in memory so that the reconstructed surface can be visualized.
If to_file is true, then the output will be written to disk instead of being kept in memory. The output is written to a custom bobj format that is a simple conversion of the Wavefront object format to a binary form. If the bobj files become too large (around 400 megs), they will be split into multiple output files.
The bobj format consists of two types of fields: vertex positions, and triangles that index the vertices. The C-like specifications of the field types follow.
struct vertex { char type = 0; float x, y, z; }; struct triangle { char type = 1; int v0, v1, v2; };
A vertex's index is implied by its order in the file, and indexing starts from 1. There is no header, and the only guarantee on the ordering of triangle and vertex fileds is that trinagles will only index vertices that are specified earlier in the file.
Pruning adds one pipeline stage for Daubechies 4, and two stages for Haar wavelets. Pruning also adds 8 bytes per node. Pruning enables adaptive resolution of the octree along a surface and prevents undersampling with sparse data.
Blurring (a.k.a. smoothing) adds one stage to the pipeline and 32 bytes to each node. This option applies an adaptive 3x3x3 Gaussian blur to the approximated indicator function.
When set to true, the resolution of the number of points in a cell is stored at one lower depth than when set to false. Thus, setting pts_node to true sacrifices some quality in approximating the surface area at each point, but saves 24 bytes per node.
Setting above_below to true uses one more byte per node to store information used to restrict the dual marching cubes traversal, and can save some time.
During Haar reconstruction, setting eval_pass to true will store the function values in the tree rather than evaluating the function on the fly. This adds one pipeline stage and 32 bytes per node, and should only be used to visualize the function values with a plane cross section.
When set to true, streaming is enabled, and when set to false, the reconstruction is done entirely in memory. Not streaming saves time, and streaming saves memory.
For non-closed surfaces, it can be useful to reconstruct the surface only where scan data exists. Enable this option to cut away all surface that is not near input points.
To guarantee that there will be no artifacts from streaming in the streaming surface reconstruction, this option must be enabled. The option ensures that the tree is filled to a uniform depth up to the depth kept in memory. Often, this option is not required, and can be disabled to save some memory.
When enabled, the indicator function values can be visualized by a plane that slices through the volume.
When enabled, the input points can be visualized alongside the surface.
A configuration file can be specified to load parameters from. The configuration file uses the exact same format as the command line, except that lines can be commented by using the # character.
Drag with the left mouse button.
Drag with the right mouse button.
Drag with the middle mouse button.
Press p to toggle and make sure that loading of points is enabled.
Press s to toggle display of the surface.
Press l to toggle display of lines around triangles.
Press o to toggle and make sure that loading of the plane, and the evaluation pass or blur are enabled, and also that streaming is disabled.
Pressing [, ], -, and + move the slice along the plane normal, and x, y, z select the slice orientation.
There are ten savable views that can be selected by pressing 0-9. After selecting a view, write to the view by pressing w, or read from it by pressing r.