【问题标题】:Perlin function in Unity produces small range of the same numbersUnity中的Perlin函数产生小范围的相同数字
【发布时间】:2020-08-02 19:52:22
【问题描述】:

我正在使用 Unity 的 Mathf.PerlinNoise() 函数来产生我的柏林噪声。函数的输出总是介于 0.45f 和 0.55f 之间,即使 perlin 函数应该输出 0 到 1 之间的值。

您可能认为这是因为我输入了相似的值,但事实并非如此。我已经改变了输入,比如改变比例、改变偏移量,当然还有不同的 x 和 y,但它们似乎都产生了相同的值。

public static float terrainNoise(int x, int y, int seed, float scale, int offset)
    {
        System.Random prng = new System.Random(seed);
        float seedOffsetX = prng.Next(-100000, 100000);
        float seedOffsetY = prng.Next(-100000, 100000);

        float sampleX = ((x / LookUpData.chunkWidth) * scale) + 0.01f;
        float sampleY = ((y / LookUpData.chunkHeight) * scale) + 0.01f;

        float value = Mathf.PerlinNoise(sampleX + offset + seedOffsetX, sampleY + offset + seedOffsetY);
        Mathf.Clamp(value, 0, 1);
        return value;
    }

【问题讨论】:

  • '噪声在每个点不包含完全随机的值,而是由“波”组成,其值在整个模式中逐渐增加和减少。'看起来像它的工作。

标签: c# unity3d perlin-noise


【解决方案1】:

我看到的几件事:

  • 确保 chunkWidth 和 chunkHeight 是浮点数,或者您可以使用 * (scale / LookupData.chunkWidth)。这就是我看到的可能导致您的错误的原因。它只是从几个位置采样,因为它是通过整数除法捕捉到网格的。
  • 最终,我会放弃 Unity Mathf.PerlinNoise。它不仅不可播种,而且还是 Perlin 噪声,而不是更新的、不太明显的网格对齐功能。 Perlin above, two Simplex below。 OpenSimplex2 是我创建/使用/推荐的,但它肯定不是唯一的选择。请注意,范围是 -1 到 1 而不是 0 到 1,因此如果直接替换它,您可能需要执行 value = value * 0.5f + 0.5f

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多