2014-10-27 71 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上有很好的描述和实现。