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

9
我的名字是Chris,我正在开发我的第一个Java游戏。 迄今为止,我已经创建了一个基于瓷砖的2D游戏,但是我的关卡设计方式是这样的:如果我创建一张全部都是绿色的图像,那么这个绿色就代表草地。如果我放置一个蓝色的像素,游戏就会把它当作水块。
然而,这种方法限制了游戏的关卡设计,我更希望有一个无限的瓷砖地形。
作为一个初学者,我查找了不同的方法。其中一个特别重要的方法是被称为Perlin噪声。
我研究了它,但它看起来非常复杂。
是否有人可以用更简单的术语定义它?
另外,如果您有任何“降低智商”的教程,以提供简要概述,那就太棒了!
抱歉我没有太明确,实际上我正在避免这样做。

我不完全确定您想要实现什么,但从我的理解来看,Perlin噪声似乎不是适合您的工具。 - Henry
毫无疑问,这似乎不适合我, 最糟糕的情况是尝试一下。 - Kultid_Games
3个回答

14

我建议跳过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实际上是我为自己的游戏开发的算法,所以我很无耻地宣传一下,但我认为这是您可以使用的最好算法。


11

Daniel Shiffman《代码本质》一书中精彩介绍了Perlin噪声。该在线书籍提供了很棒的Javascript/ProcessingJS示例代码,以演示一些重要概念:

一个好的随机数生成器产生的数字之间没有关系且没有可辨识别的模式。正如我们开始看到的,当编程有机、栩栩如生的行为时,略微的随机性是一件好事。然而,仅依赖随机性并不一定是自然的。由发明人Ken Perlin开发的算法 “Perlin噪声” 将这个概念考虑在内。Perlin在1980年代早期工作于原版Tron电影时开发了噪声函数;它被设计来为计算机生成的效果创建程序纹理。1997年,Perlin因此获得了技术成就奖学院奖项。Perlin噪声可用于生成具有自然特质的各种效果,比如云、景观和大理石样式等。

Perlin噪声具有更有机的外观,因为它生成自然排序(“平滑”)的伪随机数序列。下面左侧的图表显示随时间变化的Perlin噪声,其中x轴表示时间;请注意曲线的平滑性。右侧的图表显示随时间变化的纯随机数。

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

Khan Academy 专门为 高级 JavaScript 课程致力于剖析 Shiffman 在他的书中展示的一些东西。他们有很好的随机性教学,当然,还有一个专门针对Perlin 噪声的课程。


2
非常感谢。总结得很好,喜欢背后的故事。谢谢。 - Kultid_Games

1

您不必立即完全理解perlin或simplex实现。您可以在玩弄各种方法的参数时慢慢学习。只需使用它,通过将x、y、可能是z或更多维度参数与网格坐标一起输入即可。为了保持简单,您基本上需要混合/叠加不同比例的插值随机图像的几个层(八度)。

由于运行时可能会产生处理费用(尽管取决于分辨率/八度和处理预算或测试目的,您也可以实现相当不错的实时帧速率),因此您可能还想离线评估和存储噪声。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接