2

我正在尝试使用 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,这是应该折叠的顶点数。

但是,我可以通过日志得知网格上的顶点编号没有改变。这怎么可能?

4

1 回答 1

4

抽取通过移除元素(顶点、面等)来改变网格的连通性。OpenMesh 中网格元素的删除是通过暂时将各个元素标记为删除(使用mesh.status(handle).deleted()属性)来实现的。只有在明确请求时才会实际删除已删除元素,方法是调用mesh.garbage_collection(). 在垃圾收集之前,mesh.n_vertices()仍将标记为删除的顶点包含在其计数中。

Decimator 不会自动提示垃圾回收;留给用户这样做。插入对mesh.garbage_collection()after的调用decimater.decimate_to(...)应该可以解决您的问题。

于 2016-07-21T09:14:06.583 回答