Some time ago I wrote a simple C++ class to simplify a 3D mesh. It is based on Michael Garland's article "Surface Simplification Using Quadric Error Metrics"
The code is available under a BSD license.
A win64 executable is also available for quick testing.
The code produces good quality results. However, it is relatively slow!
Usage:
MeshSimplification fileNameIn.obj targetNTrianglesDecimatedMesh targetNVerticesDecimatedMesh maxDecimationError fileNameOut.obj
For instance, to generate a decimated mesh with 1000 triangles use the following command line:
MeshSimplification input.obj 1000 0 1.0 decimated.obj
To generate a decimated mesh with 1000 vertices:
MeshSimplification input.obj 0 1000 1.0 decimated.obj
MeshSimplification input.obj 0 0 0.01 decimated.obj
To use the mesh decimation class in your code, proceed as follows:
// input mesh Vec3<Float> * points; Vec3<int> * triangles; // Fill points and triangles with input mesh // ... // decimate mesh MeshDecimator myMDecimator; myMDecimator.Initialize(nPoints, nTriangles, points, triangles); myMDecimator.Decimate(targetNVerticesDecimatedMesh, targetNTrianglesDecimatedMesh, maxDecimationError); // allocate memory for decimated mesh size_t nVerticesDecimatedMesh = myMDecimator.GetNVertices(); size_t nTrianglesDecimatedMesh = myMDecimator.GetNVertices(); Vec3<Float> * decimatedMeshPoints = new Vec3<Float>[nVerticesDecimatedMesh]; Vec3<int> * decimatedMeshTriangles = new Vec3<int>[nTrianglesDecimatedMesh]; // retrieve decimated mesh myMDecimator.GetMeshData(decimatedMeshPoints, decimatedMeshTriangles);