8

研究目的のためだけに、適切な破壊可能な地形を構築しようとしています。まあ、すべてうまくいきましたが、解像度は私を十分に満足させるものではありません. MC アルゴリズムを実装する例をたくさん見てきましたが、私が理解している限り、それらのほとんどは関数を使用して最終メッシュを三角測量しており、これは私には適切ではありません。

地形をどのように構築しているかを簡単に説明しようと思います。最終的な地形の解像度を改善または向上させる方法を提案してくれる人がいるかもしれません。

1) MC 三角形の事前計算。

各ケース (0-255) の MC ルックアップ テーブルを介して単純なループを実行し、[0,0,0] - [1,1,1] の三角形を計算しています。ここでは問題ありません。

2) 地形

ボクセルを保存する地形クラスがあります。一般に、次のようになります。

int size = 32;//Size of each axis.
unsigned char *voxels = new unsigned char[(size * size * size)/8];

したがって、各軸は 32 単位の長さですが、ビットごとにボクセル情報を格納します。つまり、ビットがオン (1) の場合、何かがあり、何かを描画する必要があります。

私はいくつかの機能を持っています:

TurnOn(x,y,z);
TurnOff(x,y,z);

ボクセルの位置をオンまたはオフにします。(ビットの操作に役立ちます)。

地形が割り当てられたら、パーリン ノイズを実行し、ビットをオンまたはオフにします。

私の地形クラスには、x、y、z の位置からマーチング キューブのケース番号 (0 ~ 255) を抽出する関数がもう 1 つあります。

unsigned char GetCaseNumber(x,y,z);

そのボクセルの隣人がオンかオフかを決定することによって。ここでは問題ありません。

3) レンダリング部分

軸ごとにループし、ケース番号を抽出してから、事前に計算された三角形をケースごとに取得し、x、y、z 座標に変換して、それらの三角形を描画します。ここでは問題ありません。

したがって、結果は次のようになります。

地形

しかし、ご覧のとおり、どの単一の場所でも、解像度はたとえばこれに匹敵しません: (ソース: angelfire.com )MC

MC の例で、人々が「iso 値」と呼ばれるものを使用しているのを見たことがありますが、これは私には理解できません。私の仕事を改善する方法、または iso 値とは何か、それを均一なグリッドに実装する方法についての提案は本当に素敵です。

4

1 に答える 1

10

問題は、ボクセルがバイナリ マスク (オンまたはオフのみ) であることです。

これは、「デフォルト」のマーチング キューブ アルゴリズムには最適ですが、メッシュに鋭いエッジが得られることを意味します。

滑らかな例は、おそらく滑らかなスカラー データから生成されます。

データが 0 から 1.0 の間で滑らかに変化し、しきい値を 0.5 に設定したとします。ここで、特定の立方体がどの構成であるかを検出した後、生成されたすべての頂点を調べます。

2 つのボクセル間のエッジに頂点があり、一方の値が 0.4 で、もう一方の値が 0.7 であるとします。次に、頂点を、0.4 と 0.7 の間で補間するときに正確に 0.5 (しきい値) になる位置に移動します。したがって、0.4 頂点に近づきます。

このように、各頂点は補間された等値面上に正確にあり、より滑らかな三角形を生成します。

ただし、入力ボクセルがスカラーである (そして滑らかに変化する) 必要があります。ボクセルがバイレベル (すべて 0 または 1) の場合、これは前に取得したものと同じ三角形を生成します。

別のアイデア(あなたの質問への答えではありませんが、おそらく役立つでしょう):

数学的な正確さを必要とせずにレンダリングをよりスムーズにするために、各頂点の平均法線ベクトルを計算し、それに接続する各三角形にその法線を使用することは価値があります。これにより、鋭いエッジが隠されます。

于 2012-01-04T20:05:11.167 に答える