私は主に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 を使用します。