您实际上可能想跳过 Perlin Noise 并查看名为 OpenSimplex Noise 的内容。
Perlin Noise 是一种较旧的算法,往往会出现明显的网格伪影。它倾向于沿基轴和 45 度对角线排列其所有特征。
OpenSimplex 噪声对于与 Perlin 噪声基本相同的所有事情都很有用:噪声采用输入点(在 2D、3D 或 4D 中)并返回介于 -1 和 1 之间的值。输出值随输入坐标变化。
如果您有兴趣了解该算法在技术层面的工作原理......基本上它需要一个 [math]n 维 hypercubic tiling(正方形、立方体、正方体......)并将其沿主要方向拉伸对角线以形成simplectic honeycomb。然后它伪随机地选择每个顶点的梯度方向,外推它们,并将它们乘以基于距离的函数(“内核”),该函数在一定半径后变为零并保持为零。输入点被“倾斜”以找到超立方蜂窝基上的有效坐标,然后通过基于超立方空间坐标的快捷数学来确定它在单晶蜂窝上的哪些形状,并从那里确定哪些顶点有助于那个时候的价值[/math]....但是好消息是你不需要为了简单地使用它!
要使用它,请将 OpenSimplexNoise.java 放到您的目录中,然后执行以下操作:
OpenSimplexNoise noise = new OpenSimplexNoise(); //May provide seed as argument to generate different patterns.
for (int y = 0; y < 256; y++) {
for (int x = 0; x < 256; x++) {
double value = noise.eval(x / 32.0, y / 32.0, 0.5); //2D slice of 3D at z=0.5
//Now do whatever you need to do with the value.
}
}
这是 Perlin 噪声和 OpenSimplex 噪声之间差异的演示:
顶部是 Perlin,底部是 OpenSimplex。两者都是 3D 函数的 2D 切片。最左边是基本的noise(x,y,0)纹理,接下来是黑色/白色的负片/正片,接下来是黑色,|noise(x,y,0)|
请注意,还有一种称为 Simplex Noise 的算法,其工作方式与 OpenSimplex Noise 不同。 Simplex Noise 是由同一个人 Ken Perlin 在 Perlin noise 之后开发的,但不幸的是 3D+ 版本背负了专利。 OpenSimplex Noise 实际上是我自己开发的,作为游戏开发项目的一部分,可供任何人使用。