有关Perlin噪音的问题(如何运作)

时间:2013-08-29 13:08:47

标签: algorithm fractals perlin-noise

我目前正在尝试学习Perlin噪音,特别是用于地形生成的2D噪音。过去几天我一直在网上阅读文章,但他们似乎都不同意Perlin的噪音是如何工作的那样,那些看似权威的文章也很难理解。

所以我有一些问题,我希望有人可以帮助澄清。

  • 有些文章谈到从随机数网格(二维噪声的2D网格)开始,这是有道理的。然而,其他文章谈论用渐变向量填充网格。哪个实际用于Perlin噪音?

  • 我不知道“渐变”矢量是什么,但如果它是实际矢量,那意味着用两个数字填充网格上的每个点,对吧?它只是一种获得每个网格点两个随机数的方法,还是有理由将其视为方向向量?文章讨论了计算向量之间的距离,但我认为这就是插值步骤的目的......

  • 许多关于Perlin噪音的文章都谈到将多个级别的噪声组合成具有不同频率和幅度的八度音阶,以获得我正在寻找的有机结果。然而,其他文章说Perlin噪声只是一个八度音阶,并且将多个级别的噪声组合成多个八度音阶的行为实际上是“分数布朗噪声”。哪个是正确的? Perlin噪音本身只是白噪声的一种形式,而不是每个人都用它的组合噪音吗?

  • 有些文章使用一组初始的随机值来填充网格,有些文章只是写出它们的噪声函数,这样它就不是完全随机的,而是为给定的输入吐出相同的值。这是有道理的,所以结果(特别是在2D中)看起来并不混乱。但是当你开始组合多个八度音程(FBN)时呢?每个八度音阶都需要来自同一组值吗?或者你可以为每个八度音阶种植一个单独的网格(或生成器函数)吗?我想避免重复(在结果图像上看到相同的图案重复),但我不知道它背后的逻辑是什么。

  • 对于您开始使用的随机值网格(或渐变向量...),该网格的大小是否与您正在创建的图像的最终大小有关?或者纯粹是频率的函数?当你增加每个八度音阶的样本分辨率时,你是使用越来越大的网格,还是只是以更精细的分辨率重新采样相同的初始网格?

任何澄清都会非常有帮助。感谢。

2 个答案:

答案 0 :(得分:4)

  

我不知道“渐变”矢量是什么,但如果它是实际的   向量,这意味着用两个数字填充网格上的每个点,   对?它只是每个网格点获得两个随机数的方法,或者   是否有理由将其视为方向向量?文章   谈论计算向量之间的距离,但我想   这就是插值步骤

在每个坐标处只有一个数字,但是在网格点之间插入实际值。因此,(整数*)网格点之间存在梯度。这可以在Ken Perlins original source中看到。输入1,2或3个浮点数(1D,2D或3D空间中的坐标)将返回单个浮点数。

*请注意,可以缩放输入坐标,使得整数网格点不在整数输入坐标处。

  

许多关于Perlin噪音的文章都谈到了多层次的结合   噪声变成八度音程,频率和幅度不同,得到的   我正在寻找的有机结果。但是,其他文章说   Perlin噪音只是一个八度音阶,而且是组合的行为   将多个级别的噪声分成多个八度音程实际上是“分数”   布朗噪声“。这究竟是正确的吗?Perlin本身就是噪音   只是一种白噪声,而不是每个人都使用的组合噪音   它适用于?

Perlin噪音在技术上是单八度,但并不是那么有用。因此,人们经常将许多八度音阶组合在一起以产生分形噪声(其他基本噪声函数比Perlin可用于产生分形噪声)。通常人们只是根据Perlin噪声Perlin噪声调用分形噪声,这是错误的但很常见,你必须考虑它。

  

有些文章使用一组初始随机值填充网格   使用,有些文章只是写他们的噪音功能   它不是完全随机的,但为a吐出相同的值   给定输入。这是有道理的结果(特别是在2D)   看起来并不混乱。但是当你开始组合多个时呢?   噪音八度(FBN)?每个八度都需要来自同一个   一组价值观?或者你可以播种单独的网格(或生成器功能)   每个八度?我想避免重复(看到相同的模式   重复生成的图像)​​,但我不知道逻辑是什么   背后是。

对于相同的输入(坐标和种子),Perlin噪声函数应该总是吐出相同的输出。无论您是使用它来预先填充网格还是只是获取值,都完全取决于您。每个八度音程应该有不同的种子。这是Perlin噪声的定义属性:

  • 表观随机性,它应该随机看人眼*
  • 可重复,意味着使用相同的输入,它将始终给出 相同的输出*
  • 值之间的平滑过渡,意味着没有锐边*

* ref http://www.angelcode.com/dev/perlin/perlin.html

  

就你的随机值网格(或渐变向量......)而言   与,网格的大小是否与决赛有关   您正在创建的图像的大小?或者纯粹是一个功能   频率?当你增加每个八度音阶的样本分辨率时,是   您使用越来越大的网格,或只是重新采样相同的初始   网格分辨率更高?

输入的坐标(以及设置功能的频率之类的东西)应该决定噪声的属性。假设输入的坐标范围保持不变,则网格的大小应该只影响您看到噪声的分辨率。

不同的八度音程应该有不同的种子,但它们也有不同的尺度;你不只是以不同的八度音阶以更精细的分辨率重新采样相同的网格,你正在扩展你的坐标。

答案 1 :(得分:0)

这来自我将 Perlin 噪声用于程序地形的经验。

普通噪声将具有方形网格,其中节点值是随机生成的。在此基础上,您定义了一个包含两个变量的函数,例如:

  1. 在与网格节点重合的点上,函数值等于节点值
  2. 对于任何其他点,给定一个包含它的方格,对对应于该方格的四个节点值进行双线性插值

非常简单。

然而,在 Perlin 噪声中,每个网格节点都有一个用于节点值的二维向量,而不是单个数字。我们仍然需要高度函数将 2D 平面映射到标量高度值,因此说节点处的高度等于节点值(2D 向量)是没有意义的。

相反,P 点的高度函数定义如下:

  1. 取包含点 P 的方格
  2. 从那个正方形的每个节点画一个向量 V 指向 P
  3. 对于那个正方形的每个节点,取向量 V 和该节点的值(也是向量,记住)的点积,我们得到一个标量值
  4. 现在我们有四个对应于每个节点的标量值。和普通噪声一样,做双线性插值来求P点的高度

由于此定义,柏林噪声高度函数 (PNHF) 在网格节点处始终等于 0。

您可以玩转 PNHF 的域,例如旋转它、操纵频率(输入缩放)和幅度(输出缩放),从而获得一个八度音程。

总结几个不同的八度,你可以得到非常有说服力的地形。世界是你的游乐场。祝你好运!