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 に答える