我查看了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;
}
但是当我看到这个时,这对我来说是一种魔力。这实际上是如何工作的?我的意思是为什么写这篇文章的人拿这些素数代替其他人?为什么这样的等式他是如何决定使用这些方程而不是其他方程式的?只是......如何理解这一点?
答案 0 :(得分:2)
libnoise Web site对这种噪声函数背后的数学有很好的解释。特别是关于素数:
这些大整数是素数。这些整数可以修改,只要它们保持为素数;非素数可能会在输出中引入可辨别的模式。
noise::IntValueNoise3D
实际上分两步操作:第一步将(x,y,z)坐标转换为单个整数,第二步将整数放入整数噪声函数,大致产生噪声值在-1073741824和1073741824之间。noise::ValueNoise3D
只是将该整数转换为介于-1和1之间的浮点值。
至于为什么noise::IntValueNoise3D
执行所有那些复杂的操作,它基本上归结为这个特定的操作序列产生一个漂亮,嘈杂的结果,没有明显的模式可见。这不是唯一可以使用的操作顺序;任何产生足够嘈杂结果的东西都会起作用。
答案 1 :(得分:2)
随机性有一种艺术。有很多东西可以使伪随机数看起来很好。"对于很多3D功能来说,最重要的是使它看起来很好"具有适当的频率分布。确保以2 ^ 32为模数的良好频率分布的任何东西都将产生非常好看的数字。乘以一个大的素数会产生良好的频率分布,因为它们没有2 ^ 32的因子共享。