2

メッシュに操作を適用するために、三角形のスープを実際の構造化メッシュに変換する必要があるプロジェクトに取り組んでいます。メッシュ オブジェクトは、次の項目を持つハーフ エッジ タイプの構造です。

Vertex { vec3 position, int edge /* any half edge leaving the vertex */}
HalfEdge {int vertex, int pair}
Triangle {int vertex[3], int normal[3]}
BoundaryEdge {int vertex, int pair, int next, int prev}

すべてがそれらのアイテムの配列へのインデックスによって参照される場所。すべての内部エッジが接続され、すべてのエッジと境界エッジのペアが設定されたところまで来ました。問題は、境界エッジ ループの次と前のインデックスを設定する方法です (つまり、これらを見つける方法)。接続されていない境界エッジのリストからのループ)。

ループがすべて単純であれば、それは簡単です。ただし、私が使用しているメッシュには、境界「ジャンクション」、つまり頂点を共有する複数の境界ループがある場合があります。これにより、境界ループを作成する際に、複数の可能性のあるエッジのどれがループの正しい次のエッジであるかをアルゴリズムが決定しなければならないポイントが存在するようになります。間違ったエッジを選択すると、頂点に付随するすべてのエッジを反復処理できなくなる可能性があります。

これまでのところ、そのようなジャンクションに遭遇するたびに、コードは基本的に、頂点を出るハーフエッジと頂点に入るハーフエッジの次のインデックスと前のインデックスのすべての可能な割り当てを調べ、最初の割り当てを見つけます。そのため、頂点を離れる任意のハーフエッジから始めて、次のハーフエッジに到達するために edge.pair.next を使用して、他のすべてのハーフエッジ (およびこれらのエッジのみ) にアクセスできます。現在、このソリューションはあまり効率的ではなく (私はそうは思いません)、それが正しいかどうかさえわかりません。また、1 つ以下の三角形に隣接する三角形を追加する場合にも同じ問題が存在します。

a.) 私の解決策は実際に機能するのか、b.) まだ見つけられていないこれらのエッジ ループを見つけるための、より一般的に知られている/使用されている別の解決策はありますか?

4

1 に答える 1

0

同様の問題に遭遇しました。私の場合、いくつかの領域 (三角形のセットとして表される) が頂点/頂点で交差し、それらが境界になっています。目標は、各領域の境界を見つけることです。1 リング近傍 (つまり、edge.pair.next) を使用するのは難しく、非効率的であることがわかりました。

私がしたことは、各領域について、すべての三角形を考えて、境界エッジを探すことです。境界エッジを見つけるたびに、開始頂点と終了頂点をハッシュマップ (map[開始頂点]=終了頂点、マップ[終了頂点]=開始頂点) に記録します。この領域内のすべての三角形を歩いた後、境界頂点から開始し、ハッシュマップを使用して境界を構築します。

三角形分割の境界に穴がある場合、三角形分割は多様体ではないため、上記の方法は失敗します。回避策: 1. 元のサーフェスに穴がある場合は、補間を使用して穴を埋めてみてください。2. 元のサーフェスに穴がなく、結果の三角形分割に穴がある場合、問題は三角形分割を生成する不適切なコードが原因です。そのため、三角形分割を生成するアルゴリズムを変更したい場合があります。

于 2015-07-20T20:28:38.593 に答える