7

このマーチング キューブ アルゴリズムを使用して 3D 等値面を描画しています (C# に移植され、MeshGeomtry3Ds を出力しますが、それ以外は同じです)。結果のサーフェスは見栄えがしますが、計算に時間がかかります。

マーチング キューブを高速化する方法はありますか? 最も明白な方法は、単純に空間サンプリング レートを下げることですが、これにより結果として得られるメッシュの品質が低下します。これは避けたいです。

私は 2 パス システムを検討しています。このシステムでは、最初のパスで空間をより粗くサンプリングし、電界強度がアイソレベルをはるかに下回るボリュームを排除します。これは賢明ですか?落とし穴は何ですか?

編集:コードはプロファイリングされており、CPU 時間の大部分は、マーチング キューブ ルーチン自体と各グリッド セル コーナーの電界強度計算の間で分割されます。場の計算は私の手に負えないので、立方体ルーチンを高速化することが私の唯一の選択肢です...

両方のシステムへの呼び出しの数を大幅に減らすことができるので、私はまだデッドスペースを排除しようとする考えに惹かれています。

4

4 に答える 4

5

これが少し古いことは承知していますが、最近、ほぼ同じソースに基づいてマーチング キューブを実装しました。ここには多くの非効率性があります。少なくとも次のようなことをしていた場合

for (int x=0; x<densityArrayWidth; x++)
  for (int z=0; z<densityArrayLength; z++)
    for (int y=0; y<densityArrayHeight; y++)
      Polygonize(Gridcell, isolevel, Triangles)

edgeTable と Tritable を何回再割り当てするか見てみましょう。それらはすぐに全体のクラスに移動する必要があります。ポイント/値から三角形に直接移動して、gridCell オブジェクトも捨てました。

要するに、アルゴリズムの複雑さだけではなく、メモリの割り当て (そしてベースではこれが大量のメモリを処理します) にも時間がかかります。

于 2012-06-06T18:57:16.613 に答える
2

他の誰かがここにたどり着いた場合に備えて、より粗いサンプリング レートによるデッド スペースの除去は、事実上まったく違いがありません。リモートで安全な(つまり、アーティファクトをサンプリングするための境界を許可する)より粗いサンプリングは、リモートで重要なフィールドでとにかくグリッドの大部分をつかむことになります。

基礎となるフィールド評価を高速化すること (大量のメモ化を伴う) は、パフォーマンスの問題をほとんど解決するように見えました。

于 2009-06-18T21:39:28.200 に答える
0

代わりに行進四面体を試してみてください。数学はより単純で、セルごとに考慮できるケースが少なくなります。

于 2010-04-25T05:45:05.380 に答える
0

各立方体には 12 のエッジがあります。各立方体を調べて 12 の交点を見つけた場合、交点の計算が 4 倍多すぎます。各立方体の左下隅にある 3 つのエッジだけを使用し、余分な行を追加する必要があります。ゾーンの右上隅にあり、特別なアップグレードを使用して、見つけたすべての値にアクセスします。議論する必要があり、複雑なので、これについてトピックを作成します。

また、Octree を使用して ISO レベルを評価し、ISO レベルから遠く離れた領域をスキップすることにより、ポリゴンが必要な空間領域をテストします。

伝播を見てみましたが、それほど信頼性が高く効率的ではありません。

于 2013-04-17T08:29:07.947 に答える