我正在尝试使用OpenMesh对网格进行抽取。 我按照文档中的说明进行了跟踪:
cout << "Vertices: " << mesh->n_vertices() << endl;
DecimaterT<Mesh> decimater(*mesh); // a decimater object, connected to a mesh
ModQuadricT<Mesh>::Handle hModQuadric; // use a quadric module
decimater.add(hModQuadric); // register module at the decimater
decimater.initialize(); // let the decimater initialize the mesh and the
// modules
decimater.decimate_to(15000); // do decimation
cout << "Vertices: " << decimater.mesh().n_vertices() << endl;
decimate_to方法正确终止并返回56,000,这是应该折叠的顶点数。
但是,我可以通过日志告诉网格上的顶点数没有改变。 这怎么可能?
答案 0 :(得分:3)
抽取通过删除元素(顶点,面等)来更改网格的连通性。在OpenMesh中删除网格元素是通过暂时标记要删除的相应元素(使用mesh.status(handle).deleted()
属性)来实现的。只有在明确请求时才会通过调用mesh.garbage_collection()
来实际删除已删除的元素。在垃圾收集之前,mesh.n_vertices()
仍然包括在其计数中标记为删除的顶点。
Decimator不会自动提示垃圾收集;留给用户这样做。在mesh.garbage_collection()
之后插入decimater.decimate_to(...)
的来电可以解决您的问题。