首页 > 解决方案 > Unity中的Perlin函数产生小范围的相同数字

问题描述

我正在使用 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#unity3dperlin-noise

解决方案


我看到的几件事:

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

推荐阅读