OpenMesh Decimater не уменьшает количество вершин

Я пытаюсь уничтожить сетку, используя 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 — количество вершин, которые должны были свернуть.

Однако по логу я могу сказать, что номер вершины на сетке не изменился. Как это возможно?


person Lake    schedule 20.07.2016    source источник


Ответы (1)


Децимация изменяет связность сетки, удаляя элементы (вершины, грани и т. д.). Удаление элементов сетки в OpenMesh реализуется путем предварительной маркировки соответствующих элементов для удаления (используя свойство mesh.status(handle).deleted()). Фактическое удаление удаленных элементов происходит только при явном запросе путем вызова mesh.garbage_collection(). Перед сборкой мусора mesh.n_vertices() по-прежнему включает в свой подсчет вершины, помеченные для удаления.

Decimator не вызывает автоматическую сборку мусора; это остается сделать пользователю. Вставка вызова mesh.garbage_collection() после decimater.decimate_to(...) должна решить вашу проблему.

person jsb    schedule 21.07.2016
comment
Вы сделали мой день. Спасибо. У вас есть какой-нибудь указатель на то, где в официальных документах говорится об этом поведении? ^^ - person Lake; 21.07.2016
comment
@Lake Есть общее объяснение удалению элементов геометрии . К сожалению, тот факт, что decimate_to не запускает сборку мусора, по-видимому, задокументирован только в комментарии к исходному коду в реализации в DecimaterT.cpp. - person jsb; 21.07.2016
comment
@Lake Начиная с OpenMesh 6.3 документация была обновлена ​​соответствующим образом. - person jsb; 06.10.2016