2014-10-27 44 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 2014-10-27 22:35:40

回答

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

也有替代品,如柏林噪聲和單純的噪音。我會完全忽略柏林噪聲,因爲它往往會呈現視覺上重要的網格僞像(它將其所有特徵與其底層方形網格對齊)。 2D中的單純形噪聲是可以的,儘管互聯網上2D Simplex噪聲的大部分實現都使用奇怪的梯度集,導致僞像沿負對角線下降。而3D單工噪音則受到專利保護。

Perlin雜VS OpenSimplex噪聲,3D的2D切片: enter image description here

  • 左是噪聲(X,Y,0)灰度
  • 接下來是噪聲(X,Y,0)> 0?白色:黑色
  • 接下來是| noise(x,y,0)| > 0.1?白:黑
  • 接下來是噪聲(X,Y,0.5)灰度

編輯:下面是從註釋的代碼

分形噪聲:

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 
} 

河流:

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 2014-10-28 09:52:23

+0

分形噪聲: n1 = new OpenSimplexNoise(seed1); n2 = new OpenSimplexNoise(seed2); n3 =新的OpenSimplexNoise(seed3); (x/24.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) 水 生物羣: 爲X,Y { 海拔= n1.eval(X/24.0,Y/24.0,0.5); TEMP = N2 ... 雨= N3 ... 如果(海拔<0) 水 其他 } – KdotJPG 2014-10-28 21:44:07

+0

@KdotJPG {// 從三 決定生物羣落}:哎喲!優秀的答案......但最後的評論!請將該代碼放入帖子中,並刪除評論。 – usr2564301 2014-10-28 23:52:49

3

而不是使用隨機的每一點的地形,你可以考慮使用perlin or simplex noise代替。無論您讀取地圖的順序如何,這都具有順暢,可複製的優點,並且可以使用給定的起始「混排陣列」進行復制。在this post上有很好的描述和實現。