Ошибка расчета острова с шумом перлина - PullRequest
0 голосов
/ 26 мая 2019

Я занимаюсь разработкой небольшого проекта, представляющего собой сетку из шестиугольников размером 100 x 100.В приведенном ниже сценарии я рисую свои шестиугольники с помощью шума перлина, но формат, который я хочу использовать для острова, не исчезает.Я оставлю свой код и 2 примера, пока моя карта остается и как я хочу, чтобы она оставалась.

Мой остров

Мой остров

Какмне нужно

мне нужно

int getColor(float x, float z)
{
    xTO = (int)x / terrainWidth - 30;
    zTO = (int)z / terrainHeight - 30;

    float v = Mathf.PerlinNoise((xTO + x + seed) * freq, (zTO + z) * freq);
    //  v += 0.001f;

    float form = formWorld(x, z);


    if (v < 0.25f)
    {
        //water
        return 0;
    }
    else if (v < 0.5f)
    {
        //sand
        return 1;
    }

    else if (v < 0.75f)
    {
        //grass
        return 2;
    }
    else
    {
        //Trees / Forest
        MakeNewTree(new Vector3(xx, 0, z * 7.5f));
        return 2;
    }
}

1 Ответ

0 голосов
/ 26 мая 2019

Если вы хотите, чтобы ваше изображение больше походило на второе, лучшим вариантом будет добавление кругового градиента, который компенсирует ваш шум Perlin.

Самый простой способ сделать это - измерить расстояние от центра и объединить его с шумом перлина.

Вот некоторый непроверенный код.

    int getColor(float x, float z)
    {
        xTO = (int)x / terrainWidth - 30;
        zTO = (int)z / terrainHeight - 30;

        float v = Mathf.PerlinNoise((xTO + x + seed) * freq, (zTO + z) * freq);
        //  v += 0.001f;
        v -= CircleOffset(x,z)/2; //Change the two to make the island bigger.

        float form = formWorld(x, z);


        if (v < 0.25f)
        {
            //water
            return 0;
        }
        else if (v < 0.5f)
        {
            //sand
            return 1;
        }

        else if (v < 0.75f)
        {
            //grass
            return 2;
        }
        else
        {
            //Trees / Forest
            MakeNewTree(new Vector3(xx, 0, z * 7.5f));
            return 2;
        }
    }

    float CircleOffset(float x, float y)
    {
        Vector2 center = new Vector2(terrainWidth/2,terrainHeight/2);
        float distance = Mathf.Sqrt((center.x - x)*(center.x - x) + (center.y - y) * (center.y - y));
        return distance/terrainWidth;
    }

Надеюсь, это поможет!

...