Surface Simplification Using Quadric Error Metrics Garland & Heckbert Siggraph 97 Vertex Clustering (Rossignac Borrel 1992) 2 What this is about Related terms Level of detail Progressive mesh Polygon decimation Multiresolution modeling 3 Define the problem carefully Mn: triangulated input model Mg: target approximation (criterion: desired face count or a maximum tolerable error) Context: multiresolution modeling Topology preservation: no guarantee In rendering, topologgy is less important than overall appearance In particular, non-manifold regions can occur 4 Advantages Efficiency Quality Generality As we will examine these carefully as we go along (and we learned how to “sell” our research) 5 Pair Contraction Problems Definition of pair Priority of pair Contraction Book keeping Geometry optimization: error analysis 6 Approximating Error with Quadrics Error at vertex v Plane Equation Point-plane distance (signed) = pTv Squared distance v pp v 2 D 2 p T v vT p p T v T T Symmetric matrix 7 After Contraction Find q11 q Q 12 q13 q14 q12 q13 q22 q23 q23 q33 q24 q34 q14 q24 q34 q44 In case it fails (to find the inverse), find any point along v1, v2 8 Error Metric “Choose a heuristic to characterize the geometric error” Sum of squared distances to its incident planes Initial error is then zero When contraction occurs, the new point assumes the planes from both vertices And it should be placed where the error is minimized (it also happens that) the error is linearly additive The multiply count issue: argue … to get away??? (end of sec.5: sacrifice error for simplicity) 6.1 Evaluating Quote a formula (from Hoppe) to measure the distance between approximate and original model 9 Algorithm 10 Result Fig 5 & 6 11 12 13 Mesh Decimater in OpenMesh (ref, class) Perform halfedge collapsing based ona priority queue Priority determined by “modules” considering Aspect ratio Edge length Hausdorff indepedentSets Normal deviation Normal flipping Progressive mesh Quadric error Roundness • More than one decimation module can be used. But a non-binary module must be registered with the decimater • (discussion in mailing list) 14 Decimater in OpenMesh Decimater.info (std::cout); Decimater.add (Module); DecimaterT (mesh); Decimater.decimate(); // reduce as much as possible Decimater.decimate_to (n_vertices); Decimater.decimate_to_faces (nv, nf); 15 16