マーチングキューブ法によるメッシュの生成ではいくつかのケースで曖昧性があり、解像度が不十分だと穴が開いてしまうことがあることが知られていますが、実は分類方法と三角形の作り方を工夫することで穴が開かない lookup table を作ることができます。
ググってもすぐに見つからなかったので、lookup table を手動で作るためのツールを作りました。22パターンあって面倒ですが頑張ってください(記事の最後に自分で作ったテーブルを載せておきます)。
一貫性
そもそもマーチングキューブ法で作ったメッシュに穴が開いてしまうのは三角形の張り方に一貫性 (consistency) がないためであり、各パターンで一貫性のある張り方をすることでメッシュに穴が開くのを防ぐことができます。
一貫性については色々なサイトで説明がされていますが、こちらの PDF による解説が分かりやすいです。オリジナルの15通りの分類だと一貫性のある構成が不可能なので、色の反転による同一視をしないことで22通りに分類を増やし、一貫性に気を付けながら三角形を張ることでテーブルを作れます。
自分で作る際は、
赤 青
青 赤
という配色の面があったとき、必ず赤同士が繋がるように三角形を張るか、必ず青同士が繋がるように三角形を張ればOKです。これによって下の画像のように曖昧な面が生じたときの処理方法に差が出てきます。
reference: https://www.cs.upc.edu/~virtual/SGI/docs/1.%20Theory/Unit%2010.%20Volume%20models.%20Marching%20Cubes/Marching%20Cubes.pdf, p.65
流体の表面なんかを構成したい場合は綺麗に分離してくれる右側の方がいいんじゃないかと思いました。
一貫性のあるテーブル2種
積極的に内部を連結させるテーブルはこちら: table-connect.txt
積極的に内部を分離させるテーブルはこちら: table-separate.txt
フォーマットはファイル内に書いてあります。適当に加工して使ってください。例によって三角形は反時計回りが表面(外側 → 内側)です。
実は色を反転させる(id
→ id ^ 0xff
)と両者は入れ替わりますが、両方とも手作業で真心込めて作ったので厳密には一致しないと思います。たぶん。