14

我正在寻找一些允许我生成逼真的 2D 地形图的算法。现实是指人们会将此类地图视为“正常”地形图,而不是人为创建的。我不想创建逼真的地图。只是类似于可以在地理地图集中查看的地图。

到目前为止,我使用柏林噪声作为高度图,然后我添加了湖泊、河流、山脉、沼泽等。您可能会在下面的图片中看到它的外观:

地形图 http://www.freeimagehosting.net/uploads/1f1e9372bf.png

我对此不满意。这不现实,但我无法自己找出更好的东西。时间不是问题,因此算法可能需要大量计算。

谢谢你的时间。

编辑后:

我想我找到了一篇有用的文章: http://portal.acm.org/citation.cfm?id= 1255047.1255077

但是它不能免费获得,所以我仍在寻找答案或想法。

4

4 回答 4

6

我以前玩过地形生成。假设目标是位图,我找到了一种方法来制作河流之类的东西,并且总体上让它看起来更好:侵蚀。

一旦你通过其他方式生成的地形会稍微侵蚀它:你需要以像素高度表示的世界。在地图上找一个点,将一个高度单位移动到最低的邻居。将光标移动到这个邻居并重复,直到它不动。重复其他像素。

为了让河流计算你通过一个位置向下移动的次数。受打击最多的地方是河流。

跟进:我并没有侵蚀每个像素,而是简单地侵蚀大量随机像素,直到它足够风化。实际侵蚀它们的原因是这会将钻头向下移动并填充孔洞。没有它,就不会有河流,因为会有死者困住水流——流动的像素会填充任何小洞并形成工作水道。

抱歉,我无法提供任何示例,这是很多年前的事了,虽然旧代码可能在某个地方,但我不知道该去哪里找。

于 2009-09-20T17:48:55.930 回答
3

地形是由许多不同时间尺度上的无数不同原因造成的。为了真正创建逼真的地形,您必须模拟这些。

在“短期”内,水圈决定了大部分特征。您可以从包含主要特征(山脉等)的体素/粒子/高度图/网格地形开始,并将其视为不可变的,然后使用大量水模拟对其进行后处理。您需要计算河流和湖泊的位置、它们如何侵蚀基础景观以及它们形成沉积物的位置。如果我必须对此进行编码,我可能会从 3D 体素世界开始。

这将是一项艰巨的任务,我相信有很多技巧可用于生成特定地形类型,这些地形类型只需几毫秒而不是几分钟。你想创造什么样的地形?多山?低地?工业化?森林?沙漠?群岛?

长话短说:如果你想要对人类(毕竟他们往往是这类事情的专家)看起来逼真的地形,你必须通过模拟实际的地质过程来创建它。

于 2009-09-20T17:25:46.647 回答
2

我在 Terra3D 中的方法是生成随机高度值,然后进行 3 次平滑处理,并在算法中写入一点整形。重塑导致水线以下的地形稍微向下移动,而水线以上的一切都向上移动一点。效果虽然是很多山丘和小湖。这可能不是您正在寻找的东西。

但是,我不相信我的方法背后的主体不能用来获得你想要的东西。您可能只需要在整形/平滑算法中写入更多条件。例如,在较高海拔的地形上减少平滑量将创建更多的落基山脉外观。然后编写一个更复杂的平滑(或高斯)算法,在低海拔地区进一步延伸,可以将这些湖泊拉在一起形成天然河流。

如果您有兴趣,这里是Terra3D中地形生成的代码:

  // GENERATE TERRAIN
  for (i = 0; i < MAX; i++)
  {     
    for (i2 = 0; i2 < MAX; i2++)
    {
        if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10)
        field[i][i2].y=0;
      else
        field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05;
    }
  }

  // SMOOTH/RESHAPE TERRAIN
  for (int cnt = 0; cnt < 3; cnt++)
  {  
    for (int t = 1; t < MAX-1; t++)
    {
      for (int t2 = 1; t2 < MAX-1; t2++)
      {
        field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4;

        if (cnt == 0)
        {
          if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2;
          else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5;
        } 
      }
    }
  }

这是我大约 10 年前写的草率代码。Terra3D 是一个漫长的实验学习过程,在黑暗中摸索以产生我正在寻找的效果类型。但也许它会有所帮助。

于 2010-02-03T20:24:29.743 回答
1

我知道这是一个非常古老的问题,但我正在为未来寻找好的地形生成器的人回答这个问题,就像我一样。使用 World Machine 2 的免费版本。它是一个地形生成器,可以完全按照您的要求做,甚至更多。它已被专业人士用于生成图像、3D 世界地形,甚至用于生成您所建议的地图。请注意,免费版本仅用于非商业用途。

于 2011-02-17T19:34:46.280 回答