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