1

私は主にPaul Bourkeの実装にいくつかの主要な調整を加えたマーチング キューブ アルゴリズムを実装しています。

  • スカラーフィールドの事前計算 (浮動小数点値)
  • std::map を使用して、最終リストで重複する頂点を回避する
  • Ogre3D で最終的なメッシュを視覚化するための頂点の保存

基本的に、私は彼のコードのほぼ 80% を変更しました。結果のメッシュには見苦しいテラスがいくつかあり、それらを回避する方法がわかりません。スカラーフィールドに浮動小数点を使用するとうまくいくと思いました。これは一般的な効果ですか?どうすれば回避できますか?

テラッシング・マーチング・キューブ

エッジ上の頂点位置を計算します。(cell.val[p1] には、指定された頂点のスカラー値が含まれます):

//if there is an intersection on this edge
        if (cell.iEdgeFlags & (1 << iEdge))
        {
            const int* edge = a2iEdgeConnection[iEdge];

            int p1 = edge[0];
            int p2 = edge[1];

            //find the approx intersection point by linear interpolation between the two edges and the density value
            float length = cell.val[p1] / (cell.val[p2] + cell.val[p1]);
            asEdgeVertex[iEdge] = cell.p[p1] + length  * (cell.p[p2] - cell.p[p1]);
        }

ここで完全なソースコードを見つけることができます: https://github.com/DieOptimistin/MarchingCubes この例のライブラリとして Ogre3D を使用します。

4

1 に答える 1