6

私の最後の質問から:マーチング キューブの質問

ただし、次のようにまだ不明です。

  1. 架空の立方体/ボクセルを作成して、頂点が等値面の下にあるかどうかを確認する方法は?
  2. どの頂点が等値面の下にあるかを知るにはどうすればよいですか?
  3. 各キューブ/ボクセルは、使用するキューブインデックス/サーフェスをどのように決定しますか?
  4. triTable のデータを使用してサーフェスを描画する方法

リンゴの点群データがあるとしましょう。
どうすればいいですか?

マーチング キューブに詳しい方、教えてください。
私は C++ と opengl しか知りません。(c は私の手に負えません)

4

3 に答える 3

2

まず、等値面は 2 つの方法で表すことができます。1 つの方法は、等値スカラーとポイントごとのスカラーを外部ソースからのデータセットとして取得することです。それがMRIスキャンのしくみです。2 番目のアプローチは、ポイント/頂点をパラメーターとして取り、新しいスカラーを返す暗黙的な関数 F() を作成することです。この関数を考えてみましょう:

float computeScalar(const Vector3<float>& v)
{
    return std::sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
}

スカラーフィールドのすべてのポイントのポイントから原点までの距離を計算します。等値が半径の場合、球を表す方法を考え出しただけです。これは|v|のためです。<= R は、球内のすべての点、またはその内部にあるすべての点に当てはまります。どの頂点が球の内側にあり、どの頂点が外側にあるかを把握するだけです。ボリュームはスペースを 2 つに分割するため、less または greater-than 演算子を使用します。立方体のどの点が内側と外側に分類されているかがわかれば、等値面が交差するエッジもわかります。三角形がないものから、三角形が 5 つあるものまであります。メッシュの頂点の位置は、交差するエッジを補間して実際の交点を見つけることで計算できます。


たとえばリンゴをスカラー フィールドで表現したい場合は、アプリケーションにプラグインするソース データ セットを取得するか、かなり複雑な暗黙関数を使用する必要があります。球体やトーラスなどの単純な幾何学的プリミティブを最初に機能させてから、そこから拡張することをお勧めします。

于 2009-04-23T17:36:35.210 に答える
1

リクエストに応じて、マーチング キューブ アルゴリズムを実装するサンプル コードを次に示します (グラフィックに JavaScript/Three.js を使用)。

http://stemkoski.github.com/Three.js/Marching-Cubes.html

理論の詳細については、次の記事をご覧ください。

http://paulbourke.net/geometry/polygonise/

于 2012-08-27T20:44:26.683 に答える
1

1) 夜の実装に依存します。ボクセルまたは立方体の各コーナー (頂点) で値を検索できるデータ構造が必要です。これは 3D 画像 (つまり、OpenGL の 3D テクスチャ) にすることも、カスタマイズした配列データ構造、またはその他の任意の形式にすることもできます。

2) 立方体の頂点を確認する必要があります。これにはさまざまな最適化がありますが、一般的には、最初のコーナーから始めて、立方体の 8 つのコーナーすべての値を確認します。

3) ほとんどの (高速) アルゴリズムは、オプションの静的配列へのルックアップ テーブルとして使用するビットマスクを作成します。これには非常に多くの可能なオプションしかありません。

4) triTable から三角形を作成したら、OpenGL を使用してそれらをレンダリングできます。

リンゴの点群データがあるとしましょう。どうすればいいですか?

これは、マーチング キューブでは機能しません。立方体のマーチングにはボクセル データが必要なため、データの点群を立方体ボリュームに配置するアルゴリズムを使用する必要があります。ガウス スプラッティングは、ここではオプションです。

通常、ポイント クラウドから作業していてサーフェスを表示したい場合は、マーチング キューブではなく、サーフェス再構成アルゴリズムを調べる必要があります。

さらに詳しく知りたい場合は、視覚化手法に関する本を読むことを強くお勧めします。良いものは、Kitware 関係者の The Visualization Toolkitです。

VTKをご覧になることをお勧めします。マーチング キューブの C++ 実装があり、完全にオープン ソースです。

于 2009-04-23T17:04:51.603 に答える