2009-09-19 265 views
14

我正在寻找一些算法,可以让我生成逼真的二维地形图。 通过写实我的意思是,这个人会将这种地图视为“正常”地形图,而不是人为创建的。 我不想制作逼真的地图。只是类似于可以在地理地图集中查看的地图。逼真的二维地形图生成

到目前为止,我使用perlin noise为高度图,然后我添加湖泊,河流,山脉,沼泽等。你可以看看它的外观下面的图片:

Terrain map http://www.freeimagehosting.net/uploads/1f1e9372bf.png

我不喜欢它。这是不现实的,但我不能自己找出更好的东西。时间不是问题,所以算法可能会计算量大。

谢谢你的时间。

编辑后:

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

但是它不能免费获取,所以我仍然在寻找答案或创意。

+4

我找不到我想要的文章,但它基本上使用了一个基于位置的山丘系统来生成漂亮的岛屿。这可能与此处链接:http://pcg.wikidot.com/articles 但我cba经历了他们所有。 – Pod 2009-09-20 16:58:19

+0

对于伟大的链接+1。感谢资源Pod。我确实发现他们真的很有帮助。 – Wodzu 2009-09-20 17:47:11

+0

你没有说为什么它不现实,在这些效果图,河流,边界,形状等方面限定了你不满意的地方......我不喜欢绿色与蓝色的比例,太多的绿色没有形成对比,而且河流是湖泊......所以至少要增加更多的水或一些高度信息,如海滩,三角洲,山峰等,以及更多的海岸线。 – 2014-03-05 10:06:00

回答

2

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

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

这将是一个巨大的任务,我敢肯定有很多技巧可用于生成需要几毫秒而不是几分钟的特定地形类型。你想创造什么样的地形?多山?低地?工业化?森林?沙漠?群岛?长话短说:如果你想要人类看起来比较现实的地形(毕竟,这些东西往往是专家),你必须通过模拟实际的地质过程来创建它。

5

我以前玩过地形世代。假设目标是一个位图,我发现了一种方法来制作像河流一样的东西,并且通常使它看起来更好:腐蚀。

一旦你有其他手段产生的地形侵蚀它一点:你需要世界表示为像素的高度。在地图上找一个点并将一个高度单位移动到最低的邻居。移动光标到这个邻居并重复,直到它不移动。重复其他像素。

使河流数你通过一个位置移动位的次数。最受打击的景点是河流。

后续工作:我没有侵蚀每个像素,只是大量的随机像素,直到它足够风化。实际侵蚀它们的原因是,这会导致比特数降低并填充空洞。如果没有这样的话,就不会有河流,因为会有死水堵住水流 - 流动的像素会填满任何小孔并形成工作水道。

对不起,我不能给任何样品,这是很多年前,而旧的代码可能在某处,我不知道在哪里看。

+0

谢谢罗兰。我不确定我是否正确理解你。我必须侵蚀地图上的每个像素吗?这在某种程度上可以与本地山顶上的例子相比,而不是以某个特定方向下降。 “下去”是指用较小或等高度搜索相邻像素。并继续,直到条件没有违反。这就是我现在正在做的(但我不会降低高度),你可能会看到结果。如果我能看到你的生成器的一些截图,那将是非常棒的。 – Wodzu 2009-09-20 19:29:15

+0

@Wodzu,我想罗伦的建议对你来说是正确的方向。不,你不必侵蚀每个像素;但你应该移动一些(取代它们,沉积物对于形状也很重要)。请参阅http://markjstock.org/pages/builder.html图片中的'erode'。 – Unreason 2010-06-25 09:45:47

1

我在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是一个漫长的学习过程,在黑暗中进行实验和摸索,以产生我期待的效果类型。但也许它会有所帮助。

+1

哦,我的天啊,你的网站上的菜单很烦人! – 2010-02-03 20:30:30

+1

啊,是的,我18岁时创建了这个菜单。哈哈,把音量调低一点。 ;) – 2010-02-03 20:32:16

+0

感谢史蒂夫为您的兴趣和代码。我仍在使用我的发电机!你的代码适合3D飞行模拟器,因为在这种类型的游戏中,用户通过拥有一些湖泊和山脉而感到满意。他实际上并不太在意地形结构及其逻辑。但是,我试图完成不同的事情。如果您打开地理相册并查看地形,您会发现它是随机的,但也符合一些规则。 F.E.一条河流从山上降落到一些湖泊或海洋,或者山脉被安排在一些集群中。 – Wodzu 2010-02-04 09:36:48

1

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

+0

顺便说一句,该网站是www.world-machine.com – 2011-02-17 19:35:29

+0

自由是非常有限的地图大小和生成地图只有一次(或多少次,你按“生成”按钮),当你想在你的应用程序中随机生成地图时,这不是很令人满意:) – 2011-02-17 19:46:42

+0

谢谢Felipe M.问题很老,但我仍然对任何帮助感兴趣。我给你+1的答案,因为你给了链接的地形发生器产生了一个非常漂亮的地形。但是,这个地形仍然没有任何逻辑意义;)好吧,它可以产生你一座山和一点水。但它正在生成相同对象的“集群”。湖泊,河流和其他山脉在哪里?那些“物体”必须以自然的方式放置在地图上,像大自然一样会这样做:)例如:河流从山上流向湖。 – Wodzu 2011-02-21 11:21:15