Surfaces created using the MarchingCubes Engine class
|
|
Marching Cubes created: May 2000, updated: November 2001
|
Using the Open Inventor libraries I created a subclass of
SoEngine for computing an isosurface using Marching Cubes: A High Resolution 3D Surface Construction Algorithm, by
William Lorensen and Harvey
E. Cline. This implementation is VERY different from a previous
version posted on this site. This version properly subclasses Open Inventor
and efficiently creates an isosurface. The tables provided in the code found
at Paul Bourke's page Polygonising
a scalar field were used in this implementation.
The engine takes as input a scalar field and an isovalue. Then as output are
the points, normals, and indexes into the points array used to create the
triangles. The engine can easily be connected to other Inventor nodes to
create an SoIndexedFaceSet. Below is an example of connecting the
engine into a scene graph.
// create MarchingCubes object and connect fields
MarchingCubes *mcubes = new MarchingCubes();
mcubes->ref();
mcubes->data.setValue(dims, data);
mcubes->isoValue = 1.0;
// MarchingCubes gives the triangles with the
// vertices ordered clockwise
SoShapeHints *hints = new SoShapeHints();
hints->vertexOrdering.
setValue(SoShapeHints::CLOCKWISE);
root->addChild(hints);
// connect the MarchingCubes points and
// normals to an SoVertexProperty node
SoVertexProperty *vprop = new SoVertexProperty();
vprop->ref();
vprop->vertex.connectFrom(&mcubes->points);
vprop->normal.connectFrom(&mcubes->normals);
// connect the indexes from MarchingCubes
SoIndexedFaceSet *faceSet = new SoIndexedFaceSet();
faceSet->vertexProperty = vprop;
faceSet->coordIndex.connectFrom(&mcubes->indexes);
root->addChild(faceSet);
Thanks to Gokhan Kisacikoglu, a vertex blending technique was added. The
blending is nothing but a simple test to the closest voxel corner based on a
percentage from the corner. Below is an example with the blending and
without. Also a gif animation showing the blending can be found here.
The blending reduces the number of triangles of a surface by 40% in some
cases. When tested with the MRI data to produce the brain surface, the
triangles were reduced from 1,065,244 to 636,702 without loss to the mesh
structure. An interactive example of the blending technique can be found by
downloading the 3D Grapher Open Inventor
application.
The MarchingCubes engine was used to create all the images on this
page. Below are links to the MarchingCubes source code as well as an example
which creates a sphere dataset and displays it with the engine node. (The SFScalarField class is needed by
MarchingCubes.)
|
|