1

libnoise ソースを調べたところ、ValuNoise3D 関数が見つかりました。

double noise::ValueNoise3D (int x, int y, int z, int seed)
{
    return 1.0 - ((double)IntValueNoise3D (x, y, z, seed) / 1073741824.0);
}

int noise::IntValueNoise3D (int x, int y, int z, int seed)
{
    // All constants are primes and must remain prime in order for this noise
    // function to work correctly.
    int n = (
        X_NOISE_GEN    * x
      + Y_NOISE_GEN    * y
      + Z_NOISE_GEN    * z
      + SEED_NOISE_GEN * seed)
      & 0x7fffffff;

    n = (n >> 13) ^ n;
    return (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff;
}

しかし、私がこれを見ているとき、それは私にとって魔法です. これは実際にどのように機能しますか?なぜこれを書いた人は、他の素数ではなくこれらの素数を取ったのですか? なぜそのような方程式?彼はどのようにして他の方程式ではなくこれらの方程式を使用することにしたのでしょうか? ただ...どうやってこれを理解するのですか?

4

2 に答える 2

2

ランダム性には芸術があります。疑似乱数を「見栄えのする」ものにする要素はたくさんあります。多くの 3D 関数にとって、「見栄え」を良くする上で最も重要なことは、見栄えの良い周波数分布を持つことです。2^32 を法とする適切な度数分布を保証するものは、非常に見栄えの良い数値を生成します。大きな素数を掛けると、2^32 と因数を共有しないため、良好な度数分布が得られます。

于 2013-09-15T06:53:58.370 に答える