gpt4 book ai didi

math - Perlin 噪声不同的实现

转载 作者:行者123 更新时间:2023-12-04 08:36:16 26 4
gpt4 key购买 nike

我已经阅读了一些关于柏林噪声的文章,但每篇文章似乎都有自己的实现方式:

  • this文章中,梯度函数返回单个 double 值。
  • this文章中,梯度生成为 3D 矢量。
  • this文章生成了一个静态的 256 个随机梯度向量数组,并使用置换表随机选择了一个,然后讨论了球形梯度的更复杂的细节。

  • 这些只是我看到的一些文章。对于相同算法的所有这些变体,我使用哪一种或者哪一种适合什么目的?
    我已经用这些技术中的每一种生成了地形和高度图,它们各自的输出在它们自己的方式上有很大的不同,我不知道我是否做得对,因为我不知道在输出中寻找什么(因为它是最后只是随机值)
    我只是在寻找有关何时使用什么的上下文,因此任何见解都会非常有用

    最佳答案

    有多种方法可以实现相同的算法,有些比其他的更快或更慢,有些更容易或更难理解。 The original implementation by Ken Perlin光看是很难理解的。因此,您链接的一些文章(包括我写的 #2,是的!),尝试简化实现以使其更易于理解。
    但最终,它的算法完全相同:

  • 获取输入,计算包含输入点
  • 的正方形(对于 2D Perlin 噪声,或立方体,如果使用 3D 版本)的 4 个角的坐标
  • 为所有 4 个计算一个随机值(首先为每个分配一个随机梯度向量(2D 中有 4 种可能性:(+1, +1), (-1, +1), (-1, -1) ) 和 (+1, -1)),然后计算这个随机梯度向量与从正方形角到输入点的向量之间的点积)
  • 最后,在这 4 个随机值之间平滑插值以获得最终值

  • 在第 1 篇文章中,grad 函数直接返回点积,而在第 2 篇文章中,创建了向量对象并调用了点积函数以明确正在执行的操作(这可能会比其他函数慢一点实现,因为每次要运行算法时都会创建并简要使用许多向量对象)。
    2 个实现是否会产生相同的地形/高度图取决于它们是否为正方形/立方体的每个角生成相同的随机值(点积的结果)。如果 2 种算法为网格上的每个整数点(所有可能的正方形/立方体的所有角)生成相同的随机值,那么它们将产生相同的结果。 Ken Perlin 的原始实现和 3 篇文章都使用整数数组为每个角(4 个可能的选择)生成一个随机梯度向量来计算点积。所以理论上如果数组相同,那么它们应该产生相同的结果。 (除非某些实现使用另一种方法来生成随机向量。)
    我不确定这是否能回答你的问题,所以不要犹豫,问其他问题:)
    编辑:
    通常,您不会单独使用 Perlin 噪声。因此,对于您想要的每个最终值(例如高度贴图纹理中的单个像素),您将多次调用噪声函数( Octave )。例如:
    float finalValue = 0.0f;
    float amplitude = 1.0f;
    float frequency = 1.0f;
    int octaveCount = 8;

    for (int octave = 0; octave < octaveCount; ++octave) {
    finalValue += amplitude * noise(x * frequency, y * frequency, z * frequency);
    amplitude *= 0.5f;
    frequency *= 2.0f;
    }

    // Do something fun with 'finalValue'
    频率、幅度和 Octave 音程数是您可以用来产生不同值的最常见参数。
    例如,如果您正在生成地形,您将需要多个 Octave 音程。第一个将产生山脉的粗糙形状,因此您需要高振幅(示例代码中的 1.0)和低频(上述代码中的 1.0)。但仅仅这个 Octave 音程就会导致没有细节的真正平滑的地形。对于那些小细节,您需要更多的 Octave 音程,但频率更高(因此在输入 (x, y, z) 的相同范围内,您的 Perlin 噪声值会有更多的起伏),并且频率更低幅度(你想要小细节,因为如果你保持与第一个 Octave 音程相同的幅度(在示例代码中为 1.0),会有很多起伏非常接近并且非常高,这将导致非常粗糙的山(想象一下,每走几米就有 100 米 80 度的下坡和斜坡))
    您可以使用这些参数来获得不同的结果。您还可以查找称为“域扭曲”或“扭曲噪声”的内容。基本上,您将噪声函数称为噪声函数的输入。喜欢而不是调用:
    float result = noise(x, y, z);
    你会这样称呼:
    // The numbers used are arbitrary values, you can just play around until you get something cool
    float result = noise(noise(x * 1.7), 0.5 * noise(y * 4.1), noise(z * 2.3));
    这可以产生 really interesting results

    关于math - Perlin 噪声不同的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64781549/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com