Единство перлин шумит, имея повторяющиеся узоры - PullRequest
0 голосов
/ 20 апреля 2020

Я создал класс Noise, используя Perlin Noise от Unity, как это:

public static float[,] GetNoise(Vector2Int initialOffset, float scale, float persistance, float lacunarity, int octaves)
    {
        float[,] noiseMap = new float[Chunk.width, Chunk.height];
        float maxHeight = 0;
        float minHeight = 0;

        for (int y = 0; y < Chunk.height; y++)
        {
            for (int x = 0; x < Chunk.width; x++)
            {
                float amplitude = 1;
                float frequency = 1;
                float noiseHeight = 0;

                for (int oc = 0; oc < octaves; oc++)
                {
                    float coordX = (x + initialOffset.x) / scale * frequency;
                    float coordY = (y + initialOffset.y) / scale * frequency;

                    float perlin = Mathf.PerlinNoise(coordX, coordY) * 2 - 1;
                    noiseHeight += perlin * amplitude;

                    amplitude *= persistance;
                    frequency *= lacunarity;
                }

                if (noiseHeight < minHeight)
                {
                    minHeight = noiseHeight;
                }
                if (noiseHeight > maxHeight)
                {
                    maxHeight = noiseHeight;
                }
                noiseMap[x, y] = noiseHeight;
            }
        }

        for (int y = 0; y < Chunk.height; y++)
        {
            for (int x = 0; x < Chunk.width; x++)
            {
                noiseMap[x, y] = Mathf.InverseLerp(minHeight, maxHeight, noiseMap[x, y]);
            }
        }

        return noiseMap;
    }

Однако этот код дает мне повторяющиеся паттерны, подобные этому: Patterns in the Perlin Noise

Что я делаю не так? Или нет способа избавиться от узоров?

1 Ответ

0 голосов
/ 22 апреля 2020

Я получил это работает, не очень хорошо, но работает. То, как я это сделал, я сгенерировал карту высот для каждой плитки в чанке, затем я сделал случайное размещение плиток, имея в виду карту высот. Примерно так:

if (heightMap[x, y] < 0.3 && Random.value < 0.5)
    // Add tile

Таким образом, я получил такой результат: enter image description here РЕДАКТИРОВАТЬ: Проведя дополнительное исследование о Perlin Noise, я обнаружил, что он просто не любит отрицательные координаты по какой-то причине, поэтому я так и сделал, надеюсь, это кому-нибудь поможет!

...