【问题标题】:Realistic 2D terrain map generation [closed]逼真的 2D 地形图生成 [关闭]
【发布时间】:2010-11-29 18:29:13
【问题描述】:

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

到目前为止,我使用perlin noise 制作高度图,然后添加湖泊、河流、山脉、沼泽等。你可以看看下图的样子:

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

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

感谢您的宝贵时间。

修改后:

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

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

【问题讨论】:

  • 我找不到我想要的文章,但它基本上使用了基于地区的山丘系统来生成漂亮的岛屿。它可能链接到这里:pcg.wikidot.com/articles 但我 cba 正在经历所有这些。
  • 你没说为什么不现实,把那些你不满意的效果图,河流,边界,形状......我不喜欢绿色和蓝色的比例,太多了绿色没有对比,河流是低调的......所以至少添加更多的水或一些高度信息,如海滩、三角洲、山峰等,以及更多的海岸线。
  • @ufomorace 我所说的“不现实”的意思是,当你拿一张地图时,你会看到山脉、丘陵、河流、平原、草地......一切都以逻辑方式连接起来。我在重构这个逻辑时遇到了问题。
  • @ufomorace 你已经提出了很多有效的观点......问题是在 2D 上很难显示高度信息,或者如何显示山上的森林?这就是我决定将渲染切换到 3D 的原因。首先我绘制一个 2D 形状,然后对它们进行三角剖分,然后给顶点指定高度。

标签: 2d generator terrain


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 谢谢洛伦。我不确定我是否理解正确。我必须侵蚀地图上的每个像素吗?这有点类似于仅从当地山顶开始的示例,而不是沿给定方向下降的示例。 “向下”是指搜索高度小于或等于高度的相邻像素。并继续,直到不违反条件。这就是我现在正在做的事情(但我没有降低高度),您可能会看到结果。如果我能从您的生成器中看到一些屏幕截图,那就太好了。
    • @Wodzu,我认为 Loren 的建议对您来说是正确的方向。不,您不必侵蚀每个像素;但你应该移动一些(移动它们,沉积物对形状也很重要)。参见markjstock.org/pages/builder.html 'erode' 的图片。
    【解决方案3】:

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

    【讨论】:

    • 感谢史蒂夫对代码的关注。我还在研究我的发电机!您的代码适用于 3D 飞行模拟器,因为在此类游戏中,用户对拥有一些湖泊和山脉感到满意。他其实不太关心地形结构和逻辑。但是,我正在尝试完成一些不同的事情。如果你打开一个地理相册,看看地形,你会发现它是随机的,但也符合一些规则。 f.e.一条河流从山上流向某个湖泊或大海,或者山脉排列成一些簇。
    • 此外,与地理地图集中的湖泊和山脉相比,从顶部看到的湖泊和山脉(带有 2D 视图)看起来会很人工。这在 3D 飞行模拟器中不会引起注意,但会在一些战略回合制游戏中出现。再次感谢您的回答。
    • @Wodzu - 当然可以。听起来你在这一点上走得更远(我刚刚注意到这个问题已经有几个月了)。确实有许多我没有深入研究的细节,而你显然正在迎头赶上。祝你好运。
    【解决方案4】:

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

    【讨论】:

    • 顺便说一下,网址是www.world-machine.com
    • Free 在地图大小上非常有限,并且只生成一次地图(或按“生成”按钮多少次),当您想要在应用程序中随机生成地图时,这不是很令人满意:)
    • 谢谢 Felipe M。这个问题很老了,但我仍然对任何帮助感兴趣。我给你+1的答案是因为你提供链接的地形生成器产生了一个非常漂亮的地形。但是,这个地形仍然没有任何逻辑意义;)好吧,它可以为您生成一座山和一点水。但它正在生成相同对象的“集群”。湖泊、河流和其他山脉在哪里?那些“物体”必须以自然的方式放置在地图上,就像大自然一样:)例如:河流从山流到湖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多