2015-01-22 5 views
2

Я не уверен, работает ли мой генератор шума Perlin, шум, который он создает, очень сильно отличается от изображений, которые я вижу в Интернете. Шахта выглядит слишком однородным (это три различных изображения):2D Perlin Noise выглядит нечетным

enter image description hereenter image description hereenter image description here

Принимая во внимание то, что я обычно вижу что-то вроде:

enter image description here

Мой код в основном:

/* Get the coord of the top-left gradient of the grid (y, x) falls in */ 
int j = floor(x); 
int i = floor(y); 
/* Get the distance (y, x) is from it */ 
double dx = x-j; 
double dy = y-i; 
/* Influence of (g)radient(i)(j) (starting at the top-left one) */ 
double g00 = dot(grad(hashes, hsize, grads, i, j), dy, dx); 
double g01 = dot(grad(hashes, hsize, grads, i, j+1), dy, dx-1); 
double g10 = dot(grad(hashes, hsize, grads, i+1, j), dy-1, dx); 
double g11 = dot(grad(hashes, hsize, grads, i+1, j+1), dy-1, dx-1); 
/* Interpolate the influences using the blending function */ 
/* Linear interpol the top 2 */ 
double lt = lerp(g00, g01, fade(dx)); 
/* Linear interpol the bottom 2 */ 
double lb = lerp(g10, g11, fade(dx)); 
/* Linear interpol lb lt, completing the bilienear interpol */ 
return lerp(lt, lb, fade(dy)); 

Complete code. Он основан главным образом на учебнике this. Я использую this script, чтобы нарисовать файл csv.

Я понимаю основы, но после прочтения нескольких «учебников», которые обычно противоречат друг другу и «эталонной реализации», которая не очень читаема, у меня есть несколько сомнений. Точечные интерполяции (x, y) должны быть в каком интервале? Как я понимаю, это должно быть [0, GRID_SIZE-1] (например, [0, 255], если используется предварительно вычисленная таблица с 256 случайными значениями). Тем не менее, мой код приводит только к достаточно хорошим изображениям, когда (x, y) сопоставляется с [0, 1], и я вижу некоторые реализации в Интернете, которые отображают его на [0, 255] независимо от размера сетки. Я также не уверен, правильно ли выбрал градиенты из таблицы.

+0

Похож на шум перлина, слишком масштабированный. Посмотрите на ответ М Oehm. – lisyarus

ответ

4

Вы нормализуете координаты пикселей по всему изображению. Вы должны нормализовать его до размера вашей симплексной сетки.

Так вместо того, чтобы ваш код для внутреннего цикла:

double x = j/(double)w; 
    double y = i/(double)h; 

сделать:

double x = j/gridsize; 
    double y = i/gridsize; 

, где размер сетки дополнительный параметр, например:

double gridsize = 32.0; 

(Его, вероятно, следует выбирать так, чтобы он равномерно входил в размеры изображения.)

Смежные вопросы