Функция Perlin в Unity производит небольшой диапазон одних и тех же чисел - PullRequest
0 голосов
/ 02 августа 2020

Я использую функцию Mathf.PerlinNoise () Unity для создания шума Перлина. Результат функции всегда находится между значениями 0,45f и 0,55f, даже если функция perlin должна выводить значения от 0 до 1.

Вы можете подумать, что это потому, что я ввожу аналогичные значения, но это не тот случай. Я изменил ввод, например, сдвинул масштаб, изменил смещение и, конечно же, установил другие x и y, но все они, похоже, дают одинаковые значения-i sh.

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;
    }

1 Ответ

0 голосов
/ 11 августа 2020

Пара вещей, которые я вижу:

  • Убедитесь, что chunkWidth и chunkHeight являются числами с плавающей запятой, или вы делаете * (scale / LookupData.chunkWidth). Это то, что я вижу, что могло вызвать вашу ошибку. Это всего лишь выборка из нескольких мест, потому что она привязывается к сетке целочисленным делением.
  • В конце концов, я бы сделал go Unity Mathf.PerlinNoise. Он не только не засевается, но и является шумом Перлина, а не новой, менее заметной функцией выравнивания по сетке. Perlin вверху, два симплекса внизу . OpenSimplex2 - это то, что я создал / использую / рекомендую, но это, конечно, не единственный вариант. Обратите внимание, что диапазон составляет от -1 до 1, а не от 0 до 1, поэтому вам может потребоваться value = value * 0.5f + 0.5f при прямой замене.
...