Scanalyze is the tool developed for the Digital Michelangelo Project to view individual range scans, align sets of range scans, and view completed reconstructions.

To install scanalyze on an NT or Windows 2000 machine, download this file, and follow the directions in the readme.

To get started using scanalyze, double-click on scanalyze.exe. Then, load a model (File...Open scan...), such as "dragon_small.ply" in the directory "scanalyze\sample models". The mouse interaction is left-mouse=trackball, middle-mouse=panXY, left-middle-mouse-drag-up-down=translateZ.  The right mouse brings up a menu, including a *broken* zoom feature (causes scanalyze to crash).

Next, restart scanalyze and load a range image (see PLY section below for definition), such as "buddha_range_image1.ply". You should see a low resolution model. To increase the resolution, hit ">" or just "." on your keyboard. Keep doing this until the model is at full res. To reduce the resolution, hit "<" or just ",".  Play.



Scanalyze reads geometric data files stored in the PLY file format developed by Greg Turk. The PLY format is flexible enough to support a variety of vertex-based datasets. Scanalyze supports three sub-classes: point clouds, range images, and triangle meshes.  Below is a description of each of the file formats, complete with sample ascii files.  For the moment, the easiest way to generate the files is to study the ascii formats (they're fairly easy to read) and generate them directly.  In the future, we hope to make some tools available that are built atop the PLY library.  If you're especially eager to generate PLY files in software, you can download the library.

A point cloud is a collection of points in 3D listed in no particular order. You can load points.ply as a simple example in scanalyze, but you'll need to select "Render...Points" to see the points.  Click here to see the PLY file which consists of a sprinkling of points that have color, intensity, and normals associated with them. In the header, you need to indicate the number of vertices (36 in this example) and then list the properties to be associated with each vertex (x, y, z, diffuse_red, etc.). The vertices are then written out with all the property values written out on each line, one per vertex. Note that diffuse colors are provided as unsigned chars, but "intensities" are floats between 0.0 and 1.0.

A triangle mesh, is, well, you know, a big pile of triangles! Click here to see a piece of a triangle mesh (mesh.ply), with normals assigned per vertex in the PLY format. In the header, the number of vertices are given (20) plus vertex properties (normals in this example), followed by the number of faces (24 in this case) and a property field that is standard for all faces. Then the vertices are spelled out as before, and immediatly following, the faces are described. Since scanalyze will only accept triangle meshes, all of the faces start with the number 3, followed by the indices of the vertices that comprise the triangle. Vertex indexing starts from 0 with the first listed vertex. In this example, normals were provided, but if they are not, scanalyze will compute them for you.

A range image is a set of 3D points arranged in a regular grid pattern. The points can be connected together to create a "range surface", a process that scanalyze performs when reading a range image. The format for a PLY range image is not particularly elegant, but not terribly complicated either. Click here for an example of a range image (range_image.ply). The basic idea is that you need to provide the num_rows and num_cols, list a bunch of vertices, and then write out a range grid as a row major list with a "0" or a "1" at each grid position. A 0 indicates no valid range point at that position. A "1" must be followed by the index of the vertex that appears at that grid position. In the example provided, the grid is fully dense except for the first two entries in the first and second row.

Tips and notes: