decimater.docu 4.46 KB
 Jan Möbius committed Feb 06, 2009 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 //----------------------------------------------------------------------------- /** \page decimater_docu Mesh Decimation Framework The mesh decimation framework has 3 building blocks. -# \ref DecimaterAlg -# \ref DecimaterMod -# \ref DecimaterHnd \section DecimaterAlg The decimation algorithm The decimater (OpenMesh::Decimater::DecimaterT) provides the decimation algorithm, while the decimation modules provide the computational part. The modules compute a priority value due to some error metric, which is used by the decimater to feed a priority queue. The lower the error value, the more a potential collapse moves to the front of the queue. The one with the lowest error will always be the candidate for the next collapse. This implementation does a halfedge collapse, hence simply collapsing one vertex into another connected by a halfedge. \note The decimater ignores all 'locked' and 'deleted' vertices (see OpenMesh::Attributes::StatusBits) \attention The decimater sets temporarily the status bit 'tagged' and clears it after usage regardless of a previous state.  Jan Möbius committed Feb 18, 2015 30 31 32 33 34 35 36 37 38 39 40 41 \section DecimaterLock Block vertices from beeing touched by the Decimater You could mark vertices as locked, which should not be modified by the decimater. \code // That might be already requested mesh_->request_vertex_status(); // Get an iterator over all halfedges Mesh::HalfedgeIter he_it, he_end=mesh_->halfedges_end(); // If halfedge is boundary, lock the corresponding vertices for (he_it = mesh_->halfedges_begin(); he_it != he_end ; ++he_it)  Janis Born committed Jul 22, 2016 42  if (mesh_->is_boundary(*he_it)) {  Jan Möbius committed Feb 18, 2015 43 44 45 46 47  mesh_->status(_mesh->to_vertex_handle(*he_it)).set_locked(true); mesh_->status(_mesh->from_vertex_handle(*he_it)).set_locked(true); } \endcode  Jan Möbius committed Feb 06, 2009 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 \section DecimaterMod Decimating Modules The vertex to be removed is determined by a decimation module, which has to be derived from OpenMesh::Decimater::ModBaseT. The framework supplies already a few decimation modules. But it's very easy to build your own (\ref OpenMesh::Decimater::ModBaseT). The most important function of a decimation module is OpenMesh::Decimater::ModBaseT::collapse_priority(). It takes an OpenMesh::Decimater::CollapseInfoT describing a potential halfedge collapse, and returns a value due to some error metric. The error value is used by the decimater to feed a priority queue. Collapses with low error will be executed first, and those with large error later. Of course a module computing the error quadric is provided (OpenMesh::Decimater::ModQuadricT). This framework allows to use more than one decimation module with some restrictions. Since the error value is always normalized and sometimes very difficult to compare to other metrics, the framework allows only one non-binary module, i.e. a module computing a float value. Every further module must be a binary module, i.e. collapse_prioerity() returns OpenMesh::Decimater::ModBaseT::LEGAL_COLLAPSE or OpenMesh::Decimater::ModBaseT::ILLEGAL_COLLAPSE. In the algorithm the binary modules are evaluated first. If the evaluated collapse passes the test, then the non-binary module contributes to the decision step. In some cases the module does not contribute anything to the decision engine of the decimater, but instead, e.g. simply collects information, while the decimater does it's work. For instance the module OpenMesh::Decimater::ModProgMeshT collects information from all collapses that have been done. This information can be used to generate progressive meshes as described in "Progressive meshes", Hoppe, 1996.  Jan Möbius committed Nov 16, 2011 83 84 85 86 87 88 89 90 91 92 93  Provided decimation modules(Binary: B, Continuous: C, Special: X): - OpenMesh::Decimater::ModAspectRatioT (B,C) - OpenMesh::Decimater::ModEdgeLengthT (B,C) - OpenMesh::Decimater::ModHausdorffT (B) - OpenMesh::Decimater::ModIndependentSetsT (B) - OpenMesh::Decimater::ModNormalDeviationT (B,C) - OpenMesh::Decimater::ModNormalFlippingT (B) - OpenMesh::Decimater::ModProgMeshT (X) - OpenMesh::Decimater::ModQuadricT (B,C) - OpenMesh::Decimater::ModRoundnessT (B,C)  Jan Möbius committed Feb 06, 2009 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111  \section DecimaterHnd Module Handles Similar to properties the modules are represented outside the decimater by module handles. Before using the decimater a non-binary module must be registrated with the decimater. See \ref DecimaterExa. \section DecimaterExa Basic Setup The following small example show the basic steps to setup up a decimater: \include decimater.cc */