【问题标题】:Questions regarding Perlin noise (how it works)关于 Perlin 噪声的问题(它是如何工作的)
【发布时间】:2013-09-01 22:41:01
【问题描述】:

我目前正在尝试学习 Perlin 噪声,特别是用于地形生成的 2D 噪声。过去几天我一直在网上阅读文章,但似乎对于 Perlin 噪声的工作原理并不一致,而且那些看起来确实具有权威性的文章理解起来非常复杂。

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

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

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

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

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

  • 就您开始使用的随机值网格(或梯度向量...)而言,该网格的大小与您正在创建的图像的最终大小有关吗?还是纯粹是频率的函数?随着您增加每个倍频程的采样分辨率,您是在使用越来越大的网格,还是只是以更精细的分辨率重新采样相同的初始网格?

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

【问题讨论】:

    标签: algorithm fractals perlin-noise


    【解决方案1】:

    我不知道什么是“梯度”向量,但如果它是实际的 向量,这意味着用两个数字填充网格上的每个点, 正确的?它只是一种为每个网格点获取两个随机数的方法,还是 是否有理由将其视为方向向量?文章 谈论计算向量之间的距离,但我认为 这就是插值步骤的目的

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

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

    许多关于 Perlin 噪声的文章都谈到了将多个级别的 将噪声转换为具有不同频率和幅度的八度音阶,以获得 我正在寻找的很好的有机结果。但是,其他文章说 Perlin 噪声只是一个八度音阶,而组合的行为 将多级噪声分成多个八度音阶实际上是“分数 布朗噪声”。这实际上是正确的吗?柏林噪声本身是 只是一种白噪声,而不是每个人都使用的组合噪声 是为了什么?

    Perlin 噪声在技术上是单个八度音阶,但不是很有用。因此,人们经常组合许多倍频程来创建分形噪声(除 Perlin 之外的其他基本噪声函数可用于创建分形噪声)。通常人们只是根据 Perlin 噪声将分形噪声称为 Perlin 噪声,这是错误的,但很常见,您必须考虑到它。

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

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

    • 明显的随机性,在人眼看来应该是随机的*
    • 可重现,这意味着使用相同的输入它总是会给出
      相同的输出*
    • 值之间的平滑过渡,意味着没有锐利的边缘*

    *参考http://www.angelcode.com/dev/perlin/perlin.html

    只要你开始的随机值网格(或梯度向量......) 与,该网格的大小与最终结果有什么关系 您正在创建的图像的大小?或者是纯粹的函数 频率?当您增加每个八度音阶的样本分辨率时, 您使用越来越大的网格,或者只是重新采样相同的初始 更高分辨率的网格?

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

    不同八度的噪音应该有不同的种子,但它们也有不同的音阶;您不只是针对不同的八度音阶以更精细的分辨率重新采样相同的网格,而是在缩放您的坐标。

    【讨论】:

      【解决方案2】:

      这来自我在程序地形中使用 Perlin 噪声的经验。

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

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

      非常简单。

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

      相反,点 P 的高度函数是这样定义的:

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

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

      您可以使用 PNHF 的域,例如旋转它,操纵频率(输入缩放)和幅度(输出缩放),这样您就得到了 Octave。

      将几个不同的八度音阶相加,您可以获得非常令人信服的地形。世界是你的游乐场。祝你好运!

      【讨论】:

        猜你喜欢
        • 2013-10-11
        • 2020-06-06
        • 2014-02-15
        • 2020-02-23
        • 1970-01-01
        • 2021-09-04
        • 2011-07-28
        • 2011-09-20
        • 1970-01-01
        相关资源
        最近更新 更多