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

时间:2014-09-12 20:29:27

标签: java

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

然而,这限制了游戏的设计水平,我更倾向于拥有无限的瓷砖地形。

作为初学者,我想出了不同的方法。一种特别尖锐的方法叫做Perlin Noise。

我调查了它,但看起来非常复杂。

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

另外,如果你有任何教训,那就是“愚蠢”。它有点简单,并给出一个简短的概述,这太棒了!

抱歉,我没有太具体,我实际上是避免这样做。

3 个答案:

答案 0 :(得分:9)

Daniel ShiffmanThe Nature Of Code精彩地覆盖了Perlin噪音。它是一本在线书籍,有很棒的Javascript / ProcessingJS示例代码来演示一些重要的概念:

  

一个好的随机数生成器产生的数字没有任何关系,并且没有显示出可辨别的模式。正如我们开始看到的那样,在编写有机的,逼真的行为时,一点点随机性可能是一件好事。然而,作为单一指导原则的随机性不一定是自然的。一种名为“Perlin noise”的算法,以其发明者 Ken Perlin 命名,将这一概念考虑在内。 20世纪80年代初,Perlin在制作原始的 Tron电影时发展了噪音功能;它旨在为计算机生成的效果创建程序纹理。 1997年,Perlin因此项工作获得了奥斯卡技术成就奖。 Perlin噪音可用于产生具有自然品质的各种效果,例如云,风景和大理石等图案纹理。

     

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

enter image description here (生成这些图表的代码可在随附的书籍下载中找到。)

可汗学院专注于整个高级Javascript 课程,以剖析Shiffman在其书中展示的一些内容。它们很棒lessons on randomness,当然只有Perlin noise

答案 1 :(得分:6)

我建议跳过Perlin Noise 并查看名为 OpenSimplex Noise 的内容。

它基本上与Perlin Noise完全相同,但它的可见方向伪影明显减少。基本上,噪声采用输入坐标(2D,3D或4D)并返回介于-1和1之间的值。输出值随输入坐标的变化而不断变化。

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

  • 第一个是原始噪音
  • 第二个是绿色,其中值大于零,否则为蓝色
  • 第三个是蓝色,其中值大于-0.2且小于0.2,否则为绿色。

请注意,还有Simplex Noise(与OpenSimplex不同的算法)与Perlin Noise相比减少了方向性伪影,但是Simplex Noise的3D和更高版本的实现(如果你碰巧想要使用3D噪声来改变随着时间的推移,2D中的任何东西都背负着专利。

OpenSimplex Noise实际上是我为自己的游戏开发的一种算法,所以我知道这些无耻的插件,但我认为它对你来说是最好的。<\ n / p>

答案 2 :(得分:-1)

您没有义务立即全面了解perlin或Simplex实现。您可以在玩各种方法的参数时慢慢学习。只需通过输入x,y,可能z或更多维度参数和网格坐标来使用它。为了简单起见,你基本上混合/叠加不同比例的内插随机图像的几个层(八度)。

您可能还想离线评估和存储噪音,因为如果在运行时使用它可能意味着处理费用(尽管取决于分辨率/八度音程和您的处理预算或测试目的,您可以实现相当不错的真实时间框架率也是如此)。