2つの理由で、凹型メッシュを凸型メッシュのセットに分解できるようにしたいと思います。
- 透明なレンダリング
- 物理図形
三角形のセット(凹)を入力として受け取り、いくつかの三角形のセット(凸)を出力するアルゴリズムはありますか?元のメッシュのパーツ間の穴を埋めないようにしてください。
私はすでに小さなアイデアに出くわしました。すべての凹型エッジを見つけ、エッジループに沿ってメッシュを分割します。私は正しい軌道に乗っていますか?これをどのように実装できますか?
2つの理由で、凹型メッシュを凸型メッシュのセットに分解できるようにしたいと思います。
三角形のセット(凹)を入力として受け取り、いくつかの三角形のセット(凸)を出力するアルゴリズムはありますか?元のメッシュのパーツ間の穴を埋めないようにしてください。
私はすでに小さなアイデアに出くわしました。すべての凹型エッジを見つけ、エッジループに沿ってメッシュを分割します。私は正しい軌道に乗っていますか?これをどのように実装できますか?
回答:
私はあなたが正しい軌道に乗っていると思いますが、最適かつ/または効率的なアルゴリズムを考え出すことは別の問題です:それは難しい問題です。ただし、学問的な関心がない限り、十分なソリューションで十分な場合があります。
まず、独自のソリューションを思いつくことに関心がない場合、CGALには凸多面体分解のアルゴリズムが既に含まれています。http://doc.cgal.org/latest/Convex_decomposition_3/index.html
次にメソッドについて。3Dの多くの問題と同様に、理解しやすい2Dの問題を検討すると役立つことがよくあります。2Dの場合、タスクは反射頂点を識別し、その反射頂点から新しいエッジ(および場合によっては新しい頂点)を作成してポリゴンを2つに分割し、反射頂点がなくなるまで(したがって、すべての凸形のポリゴンになるまで)続行します。 )。
J. Mark Keilによるポリゴン分解には、次のアルゴリズム(最適化されていない形式)が含まれています。
diags = decomp(poly)
min, tmp : EdgeList
ndiags : Integer
for each reflex vertex i
for every other vertex j
if i can see j
left = the polygon given by vertices i to j
right = the polygon given by vertices j to i
tmp = decomp(left) + decomp(right)
if(tmp.size < ndiags)
min = tmp
ndiags = tmp.size
min += the diagonal i to j
return min
基本的に、すべての可能なパーティションを徹底的に比較し、生成された対角要素が最も少ないパーティションを返します。この意味で、それはやや力ずくで最適でもあります。
「見栄えのよい」分解、つまり細長い分解ではなく、よりコンパクトな形状を生成する分解が必要な場合は、Mark Bayazitによって生成された分解を検討することもできます。基本的には、反射頂点を反対側の最良の頂点、通常は別の反射頂点に接続しようとすることで機能します。
欠点の1つは、Steinerポイント(既存のエッジに存在しないポイント)を作成することにより、「より良い」分解を無視することです。
3Dの問題も同様です。反射頂点の代わりに、「ノッチエッジ」を識別します。素朴な実装は、ノッチエッジを特定し、すべての多面体が凸状になるまで多面体に対して平面カットを繰り返し実行することです。チェックアウトバーナード・チャゼルによって:「最悪の場合、最適なアルゴリズム下限と凸多面体のパーティションを」詳細については。
このアプローチは、最悪の場合、指数関数的な数の多面体を生成する可能性があることに注意してください。これは、次のようなケースが退化する可能性があるためです。
しかし、重要なメッシュがある場合(でこぼこの表面を考えてください)、とにかく結果が良くありません。複雑なメッシュにこれを使用する必要がある場合は、事前に多くの単純化を行いたいと思うでしょう。
表面Sの正確な凸分解を計算することはNP困難な問題であり、通常は多数のクラスターを生成します。これらの制限を克服するために、正確な凸制約が緩和され、代わりにSの近似凸分解が計算されます。ここでの目標は、最小数のクラスターでメッシュ三角形のパーティションを決定することであり、各クラスターの凹面がユーザー定義のしきい値よりも低いことを確認します。
次の近似凸分解ライブラリを確認してください。https : //code.google.com/p/v-hacd/ http://sourceforge.net/projects/hacd/