0

私のアプリケーションでは、多くの三角形メッシュを使用していますが、三角形の数を減らす必要がある場合があります (いくつかのエッジを折りたたむ)。メッシュの処理には、openmesh (openmesh.org) が最新 (C++) であるため、openmesh (openmesh.org) を使用しますが、主な理由は、膨大な量の依存関係をドラッグしないためです (c++ std のみに依存し、最新のコンパイラはそれを処理できます (クロスプラットフォームである必要があります) Linux/Windows/Mac OSX))。

ここで、いくつかのメッシュを減らす (openmesh の用語でデシメートする) 必要がありますが、境界を保持する必要があります。(問題のメッシュは元はグリッド (512x512) でしたが、それらの中心でいくつかの凹面要素が押し出され/追加されました。縮小後もグリッドの外縁が依然として長方形を形成することが重要です)

OpenMesh でそれらを間引き、ボリューム/アウトラインを保持する方法は見当たりません。すべての OpenMesh::Decimater::Mod* デシメーション モジュールは、ベースとして quadric を使用します。

GTS (GNU Triangulated Surface Library) では、Lindstrom-Turk リダクションが実装されており、私のニーズには理想的です (私は、それが私が望むものであるかどうかをテストするためにいくつかのダーティ ラッパーを実行しました)。マルチスレッド保存ではなく (複数のスレッドで多くのメッシュを削減しています)、GTS ではライブラリ内のグローバル変数を使用してメッシュを削減しながら一部のものを無効/有効にするため、GTS では不可能です :/) (また、glib 全体を依存関係としてドラッグします)

CGAL もあり、Lindstrom-Turk も実装されていますが、ブースト全体と他の依存関係をそれ自体にドラッグしています :/

ボーダー/ボリューム保存でデシメーションを行うopenmesh用のデシメーターモジュールはありますか? (私は検索しましたが、何も見つかりませんでした:/)

4

1 に答える 1

1

私が理解している限り、「メッシュ境界」とは、各メッシュ エッジが 2以上のメッシュ面。

OpenMesh には、OpenMesh::Decimaterこれらのエッジをそのまま保持するようにモジュールに指示する非常に簡単な方法があります。さらに良いことに、実際に使用するデシメーション モジュールのタイプに依存しません。実際のメッシュ データ構造 (つまりOpenMesh::TriMesh_ArrayKernelT<>) には、「頂点ロック」と呼ばれる機能があります。これは本質的に、デシメーション中に何があっても特定の頂点セットに触れないように OpenMesh に指示する方法です。

以下は公式ドキュメントからのコード スニペットで、C++11 用に少し変更されています。

using Mesh = OpenMesh::TriMesh_ArrayKernelT<>;

void protectMeshBoundariesFromDecimation(Mesh& mesh) {
   mesh.request_vertex_status();

   for (const auto& halfEdgeHandle : mesh.halfedges()) {
      if (mesh.is_boundary(halfEdgeHandle) ) {
         mesh.status(mesh.to_vertex_handle(halfEdgeHandle)).set_locked(true);
         mesh.status(mesh.from_vertex_handle(halfEdgeHandle)).set_locked(true);
      }
   }
}

この問題に関する完全なドキュメントを読みたい場合、上記のリンクが機能しなくなった場合は、ドキュメント コンテンツ ツリーでOpenMesh -> OpenMesh Documentation -> OpenMesh Tools Documentation -> Mesh Decimation Frameworkに移動します。

基本的に、これはメッシュのすべてのハーフ エッジ (エッジではない!) をループし、ペアを持たない (2 番目のハーフ エッジがない) ハーフ エッジを形成する頂点を「ロック」します。OpenMesh が使用するハーフエッジ データ構造の性質により、エッジO(n)のメッシュは複雑になりnます。

ハーフエッジ データ構造の詳細に慣れていない場合は、OpenMesh ドキュメントの優れた「OpenMesh の使用と理解」の紹介セクションを読むことをお勧めします。

于 2015-10-18T15:38:51.110 に答える