2014-10-27 5 views
1

Я бы хотел помочь сгладить мой случайный ландшафт, чтобы он выглядел более реалистично. На данный момент я просто назначаю случайные значения массиву и устанавливаю плитки для значений, хранящихся в массиве.Сглаживание случайно созданной местности в Java для реалистичного эффекта

Это дает этот эффект:

too random terrain

protected void generateLevel() { 
    for (int y = 0; y < height; y++) { 
     for (int x = 0; x < width; x++) { 
      int rand = random.nextInt(1000); //height 
      if(rand <= 300){ //water level 
       tiles[x + y * width] = 6;//set water 
      }else{ 
       tiles[x + y * width] = 1; //set grass 
      } 
     } 
    } 
} 

Пожалуйста, помогите мне сделать мой ландшафт выглядит более реалистичным, я хотел бы чье мнение о том, как они могли бы осуществить это в свою игру или мой. Как сгладить местность для реалистичного эффекта?

+0

Можете ли вы определить реалистичный эффект? Должен ли ваш ландшафт быть островом или больше земель с реками? Вы можете определить куски рек или озер и поставить их случайно на свою местность. – Mosa

ответ

0

Использование OpenSimplex шума: https://gist.github.com/KdotJPG/b1270127455a94ac5d19

ли sommething как:

protected void generateLevel() { 
    OpenSimplexNoise noise = new OpenSimplexNoise(); //optionally pass in a seed. 
    for (int y = 0 y < height; y++) { 
     for (int x = 0; x < width; x++) { 
      double value = noise.eval(x/24.0, y/24.0, 0.5); 
      if (value < 0) { 
       tiles[x + y * width] = 6; //set water 
      } else { 
       tiles[x + y * width] = 1; //set grass 
      } 
     } 
    } 
} 

Есть также варианты, такие как Перлин шума и Simplex шума. Я бы пропустил шум Perlin полностью, потому что он имеет тенденцию демонстрировать визуально значимые артефакты сетки (он строит все свои функции с его базовой квадратной сеткой). Симплексный шум в 2D хорошо, хотя большинство реализаций 2D-симплекс-шума в Интернете используют странный набор градиентов, который приводит к искажениям артефактов по отрицательной диагонали. И 3D-симплексный шум запатентован.

шума Перлина против OpenSimplex шума, 2D ломтиков 3D: enter image description here

  • левый шум (х, у, 0) полутоновой
  • Следующий шум (х, у, 0)> 0? белый: черный
  • Далее - шум (x, y, 0) | > 0,1? белый: черный
  • Следующий шум (х, у, 0,5) полутоновой

EDIT: Вот код от комментария

фрактал шума:

OpenSimplexNoise n1 = new OpenSimplexNoise(seed1); 
OpenSimplexNoise n2 = new OpenSimplexNoise(seed2); 
OpenSimplexNoise n3 = new OpenSimplexNoise(seed3); 

for each x,y { 
    double value = (n1.eval(x/48.0, y/48.0, 0.5) + n2.eval(x/24.0, y/24.0, 0.5) * .5 + n3.eval(x/12.0, y/12.0, 0.5) * .25)/(1 + .5 + .25); 
    //Do whatever you need to with that value 
} 

Rivers:

if (value > -0.1 || value < 0.1) 
    water 
else 
    land 

Биомы:

OpenSimplexNoise n1 = new OpenSimplexNoise(seed1); 
OpenSimplexNoise n2 = new OpenSimplexNoise(seed2); 
OpenSimplexNoise n3 = new OpenSimplexNoise(seed3); 

for each x,y { 
    double elevation = n1.eval(x/24.0, y/24.0, 0.5); 
    double temperature = n2.eval(x/24.0, y/24.0, 0.5); 
    double precipitation = n3.eval(x/24.0, y/24.0, 0.5); 

    if (elevation < 0) 
     water 
    else { 
     //decide biome based on temperature, precipitation, and elevation 
    } 
} 
+0

Спасибо, это действительно помогло и дало мне приличный ландшафт. Одна вещь, есть ли какие-то переменные, которые я могу редактировать, чтобы изменить, как создается ландшафт? – Max

+0

Фрактальный шум: n1 = новый OpenSimplexNoise (seed1); n2 = новый OpenSimplexNoise (seed2); n3 = новый OpenSimplexNoise (seed3); для x, y { v = (n1.eval (x/48.0, y/48.0, 0.5) + n2.eval (x/24.0, y/24.0, 0.5) * .5 + n3.eval (x/12,0, y/12,0, 0,5) * .25)/(1 + .5 + .25); // ...} реки: если (v> -0,1 && V <0,1) воды Биомы: для х, у { отм = n1.eval (х/24,0, у/24,0, 0,5); температура = n2 ... = n3 осадков ... если (отм <0) воды еще { // решить биом из трех }} – KdotJPG

+0

@KdotJPG: Уч! Отличный ответ ... но этот последний комментарий! Поместите этот код в свой пост и удалите комментарий. – usr2564301

3

Вместо использования случайного для каждой точки местности вы можете вместо этого использовать perlin or simplex noise. Это может быть гладким, воспроизводимым независимо от того, в каком порядке вы читаете свою карту, и воспроизводятся с помощью заданного начального «перетасованного массива». Очень хорошее описание и реализация доступны по адресу this post.