我现在很绝望。搜索每个角落和一切,但我仍然无法... 我正在寻找如何使用噪声在java中生成平铺的2d地图。这是我在编程中想要知道的唯一一件事。我学习的最好方法是查看完整的简单代码并通过测试进行分析。是否有人可以向我展示视频或向我展示一个简单的小代码如何工作? 我只是不明白如何做到这一点。如果它是简单的英语会很好,因为我无法真正理解复杂的单词。
答案 0 :(得分:5)
您可能实际上想要跳过Perlin Noise并查看名为OpenSimplex Noise的内容。
Perlin Noise是一种较旧的算法,往往会出现明显的网格伪影。它倾向于沿着主轴和45度对角线排列所有特征。
OpenSimplex Noise基本上与Perlin Noise完全相同:噪声采用输入点(2D,3D或4D)并返回介于-1和1之间的值。输出值随着输入坐标变化。
如果您有兴趣了解算法在技术层面的工作原理...基本上它需要[数学] n维hypercubic tiling(正方形,立方体,tesseracts,..)并将其拉伸主对角线以形成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 Noise和OpenSimplex Noise之间差异的演示: Top是Perlin,底部是OpenSimplex。两者都是3D功能的2D切片。最左边是基本噪声(x,y,0)纹理,接下来是黑色/白色负数/正数,接下来是黑色,其中|噪声(x,y,0)| <0.1,否则为白色,接下来是噪声(x ,y,.5)以显示Perlin中存在的整数和非整数切片之间的差异,而不是OpenSimplex。
请注意,还有一种叫做Simplex Noise的算法,它的工作方式与OpenSimplex Noise不同。 Simplex Noise是在Perlin噪音之后由同一个人Ken Perlin开发的,但不幸的是3D +版本背负了专利。 OpenSimplex Noise实际上是我自己开发的,作为游戏开发项目的一部分,并且可供任何人使用。