2

ここで記事を読んでいました: http://paulbourke.net/geometry/polygonise/ .

現在、シンプレックス ノイズを使用して生成されたマインクラフトのような地形があり、これを 32x32x128 ブロックの 16x16 チャンクに分割しました。ここで、生成したノイズをマーチング キューブの Polygonise 関数に使用したいと考えています。しかし、私の問題は、等値をどのように計算できるかです。理解できません。

ここにいる人は誰でもスプーンフィードの記事をもっと知っています. 笑

編集:

ちょっとhttp://paulbourke.net/geometry/polygonise/marchingsource.cppでこれを見つけました。

sSourcePoint[] の値は 0.5 であるため、オブジェクトを中央に配置するだけですが、fResult += 0.5/(fDx*fDx + fDy*fDy + fDz*fDz) は何をしますか? ああ、私はコードに怯えています。

GLfloat fSample1(GLfloat fX, GLfloat fY, GLfloat fZ)
{
        GLdouble fResult = 0.0;
        GLdouble fDx, fDy, fDz;
        fDx = fX - sSourcePoint[0].fX;
        fDy = fY - sSourcePoint[0].fY;
        fDz = fZ - sSourcePoint[0].fZ;
        fResult += 0.5/(fDx*fDx + fDy*fDy + fDz*fDz);

        fDx = fX - sSourcePoint[1].fX;
        fDy = fY - sSourcePoint[1].fY;
        fDz = fZ - sSourcePoint[1].fZ;
        fResult += 1.0/(fDx*fDx + fDy*fDy + fDz*fDz);

        fDx = fX - sSourcePoint[2].fX;
        fDy = fY - sSourcePoint[2].fY;
        fDz = fZ - sSourcePoint[2].fZ;
        fResult += 1.5/(fDx*fDx + fDy*fDy + fDz*fDz);

        return fResult;
}
4

1 に答える 1

3

まあ、ポールの情報源は本当に「スプーン」です。fSample1 の前のコメント:

//fSample1 finds the distance of (fX, fY, fZ) from three moving points

基本的に、彼はいわゆる「メタボール」オブジェクトを作成しているため、3 つの距離関数 (fSourcePoint[i] からの距離) を 1 つに「ブレンド」する必要があります。そうするために、彼は

Isovalue = 1/f[0] + 1/f[1] + 1/f[2]

どこ

f[i] = 1/DistFromCenterToSourcePoint[i].

効果は単純です。各 3 点から離れていると、等値はほぼゼロになります。ポイントに近づくほど、f[i] が小さくなり、等値が大きくなります。

距離は通常の 2 乗ユークリッド距離です

dist(p1, p2) = sqrt( (p1.x - p2.x)^2 + (p1.y - p2.y)^2 + (p1.z - p2.z)^2)

「Minecraft のような」等値面を実現するには、他のメトリックを使用する必要があります。タクシー (別名マンハッタン) メトリックを見てみましょう。

dist1(p1, p2) = abs(p1.x - p2.x) + abs(p1.y - p2.y) + abs(p1.z - p2.z)

または最大メトリック

distMax(p1, p2) = max( abs(p1.x - p2.x), abs(p1.y - p2.y), abs(p1.z - p2.z) )

これらのメトリックの「球体」(つまり、球体の方程式「dist = R」を満たすセット) は立方体です。

それらを反転し、合計を計算し (すべて fSample1 関数で実行します)、実験で典型的な等値を選択し、結果を確認します。

于 2012-06-27T10:48:24.433 に答える