3

実際、三角形のどのエッジに隣接がないかを確認することで、凸三角形メッシュの境界またはエッジを検出できます。したがって、メッシュにいくつかの穴がある場合、エッジの頂点があるため、その部分を簡単に強調表示できます。

しかし、問題は、エッジの頂点または境界だけがある場合、メッシュにいくつかの穴があることをどのようにして知ることができるかということです。メッシュにはいくつの穴がありますか?

私はこの問題について十分に考えましたが、それを理解することができませんでした、何か考えはありますか?穴検出の条件またはチェックはどうあるべきですか?

穴を見つけたら埋めたいです。しかし、最初にそれを検出することですか?

ありがとう。

4

3 に答える 3

2

メッシュが接続されていて、すべての境界を強調表示できると仮定します。すべての穴とメッシュ自体の境界である1つの追加の境界が残ります。それらの最大の長さの境界を破棄して、すべての穴を取得することができます。

于 2012-10-19T06:39:11.247 に答える
1

スキャナー(Kinectなど)から派生した三角形メッシュには、小さな断片(孤立したパッチ)と小さな穴があります。一般に、境界上の頂点に隣接する頂点の数を数えることで、穴を検出できることをお勧めします。境界頂点よりも隣接する頂点が少ない場合、それは穴ではありません。

于 2012-11-09T02:15:05.407 に答える
0

私の答えは閉じたメッシュでのみ機能しますが、凹穴と凸穴の場合に対応します。

説明のために、2Dメッシュを想像してみましょう。

メッシュのバウンディングボックスを計算します。この例では、バウンディングボックスに、X軸とY軸の最小値と最大値、および各値に対応する頂点インデックスを格納する必要があります。

struct BoundingBox
{
  float minX,maxX,minY,maxY;
  int vminX,vmaxX,vminY,vmaxY;
}

メッシュ内のすべての頂点を反復処理し、各ポイントを追加するときにバウンディングボックスを拡大します。頂点が最小/最大値の1つを変更する責任がある場合は、対応するvmin/vmax値を頂点メッシュインデックスで保存または上書きします。

例えば

BoundingBox bounds;
bounds.minX = verts[0].X;
bounds.maxX = verts[0].X;
bounds.minY = verts[0].Y;
bounds.maxY = verts[0].Y;
bounds.vminX = bounds.vmaxX = bounds.vminY = bounds.vmaxY = 0;
for (int i = 1; i < numVerts; i++)
{
  Vertex v = verts[i];
  if (v.X < bounds.minX) { bounds.minX = v.X; bounds.vminX = i; }
  if (v.X > bounds.maxX) { bounds.maxX = v.X; bounds.vmaxX = i; }
  if (v.Y < bounds.minY) { bounds.minY = v.Y; bounds.vminY = i; }
  if (v.Y > bounds.maxY) { bounds.maxY = v.Y; bounds.vmaxY = i; }
}

次に、境界ボックスに収集したすべての頂点を含む境界が見つかるまで、境界を繰り返し処理します。これがあなたの外側の境界です。残りの境界はメッシュ内の穴です。

于 2017-07-13T10:55:20.930 に答える