【问题标题】:How to implement Offset on Perlin noise?如何在 Perlin 噪声上实现偏移?
【发布时间】:2022-01-23 18:44:17
【问题描述】:

我需要一点帮助, 我有这个 Perlin 噪声函数,但我不知道如何正确创建偏移量。

我正在使用它来创建无限地形生成,当我使用此脚本时,单个块的噪声值不能正确组合在一起。它们会制造孔洞。

有没有办法解决这个问题?

  public  float[,] GenerateNoise(int chunkSize, int octaves, string seed, float noiseScale, float persistence, float lacunarity, Vector2 offset)
    {
        
        if (noiseScale <= 0)
        {
            noiseScale = 0.0001f;
        }


        float halfWidth = chunkSize / 2f;
        float halfHeight = chunkSize / 2f;

        float[,] noiseMap = new float[chunkSize, chunkSize];
        System.Random rand = new System.Random(seed.GetHashCode());

        //Octaves offset
        Vector2[] octavesOffset = new Vector2[octaves];
        for (int i = 0; i < octaves; i++)
        {
            float offset_X = rand.Next(-100000, 100000) + offset.x;
            float offset_Y = rand.Next(-100000, 100000) + offset.y;
            octavesOffset[i] = new Vector2(offset_X / chunkSize , offset_Y / chunkSize);
        }

        for (int x = 0; x < chunkSize; x++)
        {
            for (int y = 0; y < chunkSize; y++)
            {

                float amplitude = 1;
                float frequency = 1;
                float noiseHeight = 0;
                float superpositionCompensation = 0;

                
                for (int i = 0; i < octaves; i++)
                {


                    float sampleX = (x - halfWidth) / noiseScale * frequency + octavesOffset[i].x * frequency;
                    float sampleY = (y - halfHeight) / noiseScale * frequency + octavesOffset[i].y * frequency;

                    float noiseValue = Mathf.PerlinNoise(sampleX, sampleY);
                    noiseHeight += noiseValue * amplitude;
                    noiseHeight -= superpositionCompensation;

                    amplitude *= persistence;
                    frequency *= lacunarity;
                    superpositionCompensation = amplitude / 2;

                }

                noiseMap[x, y] = Mathf.Clamp01(noiseHeight); 
                
            }
        }

        return noiseMap;
    }

【问题讨论】:

    标签: unity3d offset terrain perlin-noise


    【解决方案1】:

    其实很简单,只需将块 x,y 坐标添加到 Mathf.PerlinNoise 即可。以您的代码为例,您可以:

    1. 将 chunkPosition 作为参数传递给它:

      public  float[,] GenerateNoise(Vector2 chunkPos, int chunkSize, int octaves, string seed, float noiseScale, float persistence, float lacunarity, Vector2 offset)
      
    2. 将其添加到 Mathf.PerlinNoise 调用中:

      float noiseValue = Mathf.PerlinNoise(sampleX + chunkPos.x, sampleY + chunkPos.y);
      

    然后确保使用适当的 chunkPos 生成每个块,其中 chunkPos 可以是它的 transform.position 或您拥有的任何坐标。 就是这样。

    【讨论】:

    • 遗憾的是它不起作用,我仍然得到不连接在一起的块
    • 我设法找到了一个修复,现在它工作正常,我不得不从 octaveOffset 计算中删除 / chunksize
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2014-02-15
    • 2023-03-16
    • 2020-06-06
    • 2011-09-20
    相关资源
    最近更新 更多