用于随机地形生成的Java 2D柏林噪声

用于随机地形生成的Java 2D柏林噪声,java,Java,我的名字是克里斯,我正在制作我的第一个Java游戏。 到目前为止,我已经创建了一个基于瓷砖的2D游戏,但是我的关卡是以这样一种方式完成的,如果我创建了一个图像,并且它是全绿色的,那么绿色代表草瓷砖。如果我放置一个蓝色像素,游戏会将其指定为水瓷砖 然而,这限制了游戏的设计水平,我更愿意有一个无限的瓷砖地形 作为一个初学者,我找到了不同的方法来做到这一点。一种特别尖锐的方法是一种叫做柏林噪音的东西 我调查了一下,但似乎很复杂 有人介意用更简单的术语来定义它吗 此外,如果你有任何教程,它'哑巴'了一点

我的名字是克里斯,我正在制作我的第一个Java游戏。 到目前为止,我已经创建了一个基于瓷砖的2D游戏,但是我的关卡是以这样一种方式完成的,如果我创建了一个图像,并且它是全绿色的,那么绿色代表草瓷砖。如果我放置一个蓝色像素,游戏会将其指定为水瓷砖

然而,这限制了游戏的设计水平,我更愿意有一个无限的瓷砖地形

作为一个初学者,我找到了不同的方法来做到这一点。一种特别尖锐的方法是一种叫做柏林噪音的东西

我调查了一下,但似乎很复杂

有人介意用更简单的术语来定义它吗

此外,如果你有任何教程,它'哑巴'了一点,并给出一个简短的概述,这将是了不起的


对不起,我没有说得太具体,我实际上是在避免这样做。

柏林噪音被on完美地掩盖了。这是一本在线书籍,其中有非常棒的Javascript/ProcessingJS示例代码来演示一些重要的概念:

一个好的随机数生成器生成的数字没有关系,也没有可识别的模式。正如我们开始看到的,当编程有机的、逼真的行为时,一点随机性可能是一件好事。然而,作为单一指导原则的随机性并不一定是自然的。一种被称为“柏林噪声”的算法,以其发明者肯·柏林的名字命名,将这一概念考虑在内。在20世纪80年代早期,柏林在制作原始电影时开发了噪音功能;它被设计用来为计算机生成的效果创建程序纹理。1997年,柏林凭借这项工作获得了奥斯卡奖的技术成就奖。柏林噪波可用于生成具有自然质量的各种效果,如云、景观和大理石等图案纹理

柏林噪声具有更有机的外观,因为它产生一个自然有序(“平滑”)的伪随机数序列。下图左侧显示了柏林噪声随时间的变化,x轴表示时间;请注意曲线的平滑度。右边的图表显示了一段时间内的纯随机数

(生成这些图形的代码可在随附的书籍下载中找到。)


Khan Academy将整个高级Javascript课程用于剖析Shiffman在书中展示的一些内容。它们有很好的,当然,一个只用于。您不必立即完全理解perlin或simplex实现。您可以在使用各种方法的参数时慢慢学习。例如,只需将x、y、可能z或更多维度参数与网格坐标一起输入即可。为了保持简单,基本上可以混合/叠加不同比例的插值随机图像的几个层(八度)


您可能还希望离线评估和存储噪声,因为在运行时使用噪声可能会带来处理费用(尽管根据分辨率/倍频程和处理预算或测试目的,您也可以获得相当不错的实时帧速率)

我建议跳过柏林河噪音,看看名为的东西

它基本上适用于所有与柏林噪波相同的东西,但它具有明显较少的可见方向伪影。基本上,噪波采用输入坐标(2D、3D或4D),并返回一个介于-1和1之间的值。输出值随输入坐标的变化而不断变化

以下是使用噪波(x/24.0,y/24.0)生成的三幅256x256图像:

  • 第一个是原始噪音
  • 第二个是绿色,值大于零,否则为蓝色
  • 第三个为蓝色,其中值大于-0.2且小于0.2,否则为绿色
请注意,与柏林噪声相比,单纯形噪声(与OpenSimplex不同的算法)减少了方向伪影,但单纯形噪声的3D和更高版本实现(如果您碰巧想使用3D噪声随时间改变2D中的任何内容)具有专利权


OpenSimplex Noise实际上是我为自己的游戏开发的一种算法,所以我知道它是无耻的插件,但我认为它是最适合你的。不完全确定你想要实现什么,但从我得到的来看,Perlin Noise似乎不是适合你的工具。毫无疑问,它似乎不适合我,我能做的最糟糕的事就是试一试。非常感谢。总结得很好,喜欢背后的故事。非常感谢。