2013-07-18 3 views
1

Я только начал с мирового поколений, и я искал учебники по всему миру, но, к сожалению, их не так много найти в Google. В последние дни я следил за учебником, но я не могу заставить свой код работать.Перлин шум - Что я делаю неправильно?

Вот мой метод Java.

private static double[][] createNoise(int xn, int yn, int sps) { 
    int m = yn * sps; 
    int n = xn * sps; 
    double[][] u = new double[yn + 1][]; 
    double[][] v = new double[yn + 1][]; 

    double[][] x = new double[m][]; 
    double[][] y = new double[m][]; 
    double[][] z = new double[m][]; 

    for (int i = 0; i < m; i++) { 
     x[i] = new double[n]; 
     y[i] = new double[n]; 
     z[i] = new double[n]; 
    } 
    for (int i = 0; i < yn + 1; i++) { 
     u[i] = new double[xn + 1]; 
     v[i] = new double[xn + 1]; 
    } 

    for (int i = 0; i < xn + 1; i++) { 
     for (int j = 0; j < yn + 1; j++) { 
      u[i][j] = nextRandom(); 
      v[i][j] = nextRandom(); 
     } 
    } 
    double hx = xn/(n - 1); 
    double hy = yn/(m - 1); 
    for (int i = 0; i < m; i++) { 
     for (int j = 0; j < n; j++) { 
      x[i][j] = hx * j; 
      y[i][j] = hy * i; 
     } 
    } 

    for (int i = 0; i < m; i++) { 
     for (int j = 0; j < n; j++) { 
      int xc = (int)x[i][j]; 
      int yc = (int)y[i][j]; 

      if (x[i][j] % 1 == 0 && x[i][j] != 0) xc = xc - 1; 
      if (y[i][j] % 1 == 0 && y[i][j] != 0) yc = yc - 1; 

      double xr = x[i][j] - xc; 
      double yr = y[i][j] - yc; 
      double s11[] = {-xr, -yr}; 
      double s21[] = {-xr, 1 - yr}; 
      double s22[] = {1 - xr, 1 - yr}; 
      double s12[] = {1 - xr, -yr}; 

      double q11 = s11[0] * u[yc][xc] + s11[1] * v[yc][xc]; 
      double q21 = s21[0] * u[yc + 1][xc] + s21[1] * v[yc + 1][xc]; 
      double q22 = s22[0] * u[yc + 1][xc + 1] + s22[1] * v[yc + 1][xc + 1]; 
      double q12 = s12[0] * u[yc][xc + 1] + s12[1] * v[yc][xc + 1]; 

      z[i][j] = lerp(x[i][j], y[i][j], xc, xc + 1, yc, yc + 1, q11, q12, q21, q22); 
     } 
    } 

    return z; 
} 

высот, что метод возвращает достаточно печально выглядит эта

enter image description here

Как вы можете видеть, первая строка/столбец работает, но после того, что алгоритм, кажется, не в состоянии. я убедился, что метод

nextRandom(); 

возвращает значение с плавающей точкой между -1 & 1.

Большое спасибо!

+0

Я ничего не знаю о perlin-шуме, но одна из ваших проблем находится здесь: hx = xn/(n - 1); он почти всегда даст вам 0, потому что в java этот оператор рассматривается как деление двух целых чисел, а результат представляет собой целое число, а затем бросается в double – gawi

+0

. Там мы идем, спасибо, сэр, вы только что спасли день! – Bram

+0

Не имея полного исходного кода (например, функцию lerp), я не могу быть уверен, но был бы ли я прав, говоря, что каждый раз, когда вы запускаете это, вы получаете разные шумы (nextRandom() для меня является красным флагом). Самыми полезными свойствами шума перлина являются его воспроизводимость; т. е. вы можете получить конкретное значение шума для (x, y) в любое время; зная только некоторую информацию о посеве и координаты (x, y). Это особенно полезно для бесконечных миров, где создание всего мира за один ход явно неосуществимо. –

ответ

1

Благодаря пользователю @gawi для указания этого.

hx = xn/(n - 1); 

разделим 2 целых числа, и, скорее всего, возвращение 0. Вы можете исправить это путем литья двойной к нему:

double hx = (double)xn/(n - 1); 

Тогда карта просто работает!

+0

не забудьте принять его как ответ на вашу проблему – gawi

+0

Я знаю, но он говорит мне, что мне нужно подождать 2 дня. -0- – Bram

+0

@gawi. Сначала вы должны отправить его как ответ;) – joe776