Шум Perlin Unity с повторяющимися узорами

Я создал класс 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;
    }

Однако этот код дает мне повторяющиеся шаблоны вроде этого:  Узоры в шуме Перлина

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


person Simple coder    schedule 20.04.2020    source источник
comment
Может кто-нибудь объяснить мне, почему не нравится этот вопрос? Что-то не так?   -  person Simple coder    schedule 20.04.2020
comment
Вы пробовали добавить шумовое послесловие, чтобы добавить больше случайности? См. Это: forum.unity.com/threads/ Perlin-noise-repeat-values.248132 /   -  person Kale_Surfer_Dude    schedule 21.04.2020
comment
Вы используете разные значения для смещения x и y?   -  person Jay    schedule 21.04.2020
comment
@Jake Да, смещения - это расстояние между плиткой и началом координат (плитка 0, 0), и я вычисляю это, умножая размер каждого фрагмента на позицию фрагмента   -  person Simple coder    schedule 21.04.2020
comment
@Kale_Surfer_Dude Я использую октавы, это считается? Я использую настройки 0,5 для стойкости, 2 для лакунарности и 4 для количества октав и шкалы 12.   -  person Simple coder    schedule 21.04.2020
comment
@Simplecoder, если вы добавите произвольную константу к вашим x и y, тогда узор будет менее заметным   -  person Jay    schedule 21.04.2020


Ответы (2)


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

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

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

person Simple coder    schedule 21.04.2020

итак .. исправил отрицательные координаты следующим образом:

//account for negatives (ex. -1 % 256 = -1, needs to loop around to 255)
if (noiseOffset.x < 0)
    noiseOffset = new Vector2(noiseOffset.x + noiseRange.x, noiseOffset.y);
if (noiseOffset.y < 0)
    noiseOffset = new Vector2(noiseOffset.x, noiseOffset.y + noiseRange.y);
person Builes o gato    schedule 20.02.2021