Java “生成瓷砖噪波贴图”;“在飞行中”;

Java “生成瓷砖噪波贴图”;“在飞行中”;,java,noise,simplex,Java,Noise,Simplex,我对为我正在开发的2D游戏生成3D高度图感兴趣。我用它来创造陆地,就像在地雷船或矮人堡垒中一样 我以前创建过2D高度贴图,但我使用了一个非常基本的算法,它只是在完全随机噪声数组的点之间插值,以创建一个固定大小的贴图。但是,这不会平铺,因为如果我尝试在它旁边添加一个新地图,它不会考虑现有地图的高度 我已经读过柏林噪声和单纯形噪声,但现在我对如何将柏林噪声或单纯形噪声应用于二维高度值数组感到困惑 在此方面的任何帮助都将不胜感激。我不知道该怎么办了。“八度音阶”这个词不在乐谱上让我害怕。我想你的问题可

我对为我正在开发的2D游戏生成3D高度图感兴趣。我用它来创造陆地,就像在地雷船或矮人堡垒中一样

我以前创建过2D高度贴图,但我使用了一个非常基本的算法,它只是在完全随机噪声数组的点之间插值,以创建一个固定大小的贴图。但是,这不会平铺,因为如果我尝试在它旁边添加一个新地图,它不会考虑现有地图的高度

我已经读过柏林噪声和单纯形噪声,但现在我对如何将柏林噪声或单纯形噪声应用于二维高度值数组感到困惑


在此方面的任何帮助都将不胜感激。我不知道该怎么办了。“八度音阶”这个词不在乐谱上让我害怕。

我想你的问题可能用词不正确。高度贴图本质上是二维的,您可以使用它生成三维地形(网格)

如果是这样的话。。。然后可以使用柏林噪波函数创建二维图像并将其用于高度贴图。如果不确定创建了什么,可以使用GIMP或Photoshop或类似工具在2D画布上创建柏林噪波,例如

Minecraft利用柏林噪波函数创建三维噪波立方体。所以,如果高度图是2D柏林噪声,那么雷管就是3D柏林噪声。还可以生成一维柏林噪波

Perlin噪波函数的优点在于,您可以通过数学控制纹理的“分辨率”和“偏移”,从而创建无缝环境。我相信Minecraft利用柏林噪声作为基础,然后使用一些细胞自动机进行最后润色

我不熟悉单纯形噪音

编辑:这里有一个链接来测试一些数学函数(正在处理)

准确地说,你必须寻找柏林/单纯形噪声。把它看作一个函数f(x,y,…)(任意多个变量),它将输出随机噪声。与纯噪波的区别在于,它作用于渐变,因此它看起来更自然,因为它“绘制”渐变,而不是具有高局部可变性的纯噪波。单纯形噪声与柏林的噪声几乎相同,但它将空间分割,而不是像柏林那样在n维网格中工作。这降低了计算成本,并有更多的优势

这可能看起来很吓人,但实际上很简单。你害怕八度音阶,但它们与音乐中的八度音阶几乎相同:只是更高(或更低)的频率噪声与原始输出混合。说到乐谱,就像同时演奏C4和C5。它仍然是C,但它添加了一些味道(波形中的小尖峰)。不要害怕,继续研究,这并不难

关于瓷砖:

如果你是指线性平铺(就像Minecraft那样),你只需要在噪声算法中使用相同的种子。一旦您接近新边界,只需生成新的数据块,它就会完美地平铺(就像无限填充噪波一样)


如果你指的是环面平铺(重复平铺,比如Pacman),我发现最好的解决方案是生成噪波平铺,然后在边界附近插值,就像它是平铺的一样。噪波会变形以匹配侧面,并且完全可以平铺。

我熟悉生成噪波本身,但我的问题是动态创建它。Minecraft只会在你接近它们时生成块,但会无缝地生成块。这就是我想要的效果。该链接指向我正在运行的程序的图像,它有2个128x128平铺,但它们没有平铺。我知道这不是您正在研究的语言,但是如果您可以从AS3 BitmapData类复制方法功能。它们允许缝合(尽可能创建可平铺的纹理),但我发现baseX和baseY可以给我“平铺”效果。但是,您必须在每次调用时重新生成纹理。看看建议使用4d噪声函数的答案:我目前对倍频程的简单解释就像在沙箱中分层沙子一样,但每个“倍频程”都使用越来越小的铲子。一开始你会看到一大堆圆圆的沙堆,但最后你会在沙箱上留下很多小斑点。我还建议现在看这个的人看看不同频率的正弦波是如何叠加在一起的,这可能会对十年后有所帮助。我最终回到这一点并接受了它,因为有人真的非常讨厌那个20岁的我大写的词。