Сделать шум Перлина масштабируемым

У меня есть алгоритм шума перлина и алгоритм шума opensimplex, который возвращает двойное значение на основе заданных значений X и Y. Я разрабатываю программное обеспечение, и я хотел бы знать, как:

  • Масштабируйте шум перлина с двойным значением 0-1
  • Разрешить создание перлина с разными разрешениями (например, 1024, 2048), но при этом сохранить масштаб, но добавить дополнительные детали.
  • Разрешить пользователю изменять размер мира, что также влияет на масштаб

Мой текущий код для этого:

double scale = ((((Double) parameters.get(SCALE).getValue() * 10) + 0.25) * ProjectSettings.WORLD_SIZE) /  ((double) resolution / 1000);
double x = 0;
double y = 0;
OpenSimplexNoise noise = new OpenSimplexNoise((Long) parameters.get(SEED).getValue());
for(int n = 0; n < resolution; n++) {
    x += scale;
    for(int m = 0; m < resolution; m++) {
        y += scale;
        values[n][m] = noise.generateOpenSimplexNoise(x, y, (Double) parameters.get(PERSISTENCE).getValue(), (Integer) parameters.get(OCTAVES).getValue());
    }
}

person frogocomics    schedule 16.10.2016    source источник


Ответы (1)


Если вы хотите изменить разрешение изображения шума Перлина, измените значения height и with в циклах for. Чтобы масштабировать, вы должны умножить первый и/или второй аргумент метода шума Перлина на некоторую переменную, которая изменяется, когда вам нужно масштабировать. Для этого может хорошо подойти временная стоимость. См. пример кода ниже.

time += 0.01;
// Change height and width values to change resolution
for(int y = 0; y < height; y++){
    for(int x = 0; x < width; x++){
        double dx = (double) x / MainWindow.height;
        double dy = (double) y / MainWindow.height;

        // Perlin noise method call
        // In order to scale, you have to multiply current values 
        // by time or other variable, which change would cause the zoom.
        double noise = noise(dx * time, dy * time);
    }
}
person Fataho    schedule 02.03.2017