Я пытаюсь уничтожить меш, используя 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, то есть количество вершин, которые должны были быть свернуты.
Тем не менее, по журналу я могу сказать, что номер вершины в сетке не изменился.
Как это возможно?
Децимация изменяет связность сетки, удаляя элементы (вершины, грани и т. Д.). Удаление элементов сетки в OpenMesh осуществляется путем предварительной маркировки соответствующих элементов для удаления (используя mesh.status(handle).deleted()
имущество). Фактическое удаление удаленных элементов происходит только по явному запросу, путем вызова mesh.garbage_collection()
, Перед сборкой мусора, mesh.n_vertices()
по-прежнему включает в себя вершины, помеченные для удаления в своем количестве.
Дециматор автоматически не запрашивает сборку мусора; это оставлено для пользователя. Вставка звонка в mesh.garbage_collection()
после decimater.decimate_to(...)
должен решить вашу проблему.
Других решений пока нет …