Java 随机地形生成

Java 随机地形生成,java,Java,如何制作地形生成器,使地形更逼真? 我的电流发生器产生这种地形: 如何使其更真实,如湖泊和河流?基本上,您可以在生成的地形上定义并应用一组过滤器 我无法详细说明,但我将为您提供一些谷歌提示: 沃罗诺图 侵蚀过滤器 扰动 对于河流,您可以创建一个voronoi图,该图在光单元之间有细的暗线。你可以有一些从暗到亮的渐变来平滑过渡。然后将该图与生成的地形叠加,沿着这些线有效地降低高度。再加上地形的不规则形状,你可以得到一些不笔直的“原始”河流 接下来,您可以应用侵蚀过滤器来模拟雨水、水流和侵蚀,以

如何制作地形生成器,使地形更逼真? 我的电流发生器产生这种地形:


如何使其更真实,如湖泊和河流?

基本上,您可以在生成的地形上定义并应用一组过滤器

我无法详细说明,但我将为您提供一些谷歌提示:

  • 沃罗诺图
  • 侵蚀过滤器
  • 扰动
  • 对于河流,您可以创建一个voronoi图,该图在光单元之间有细的暗线。你可以有一些从暗到亮的渐变来平滑过渡。然后将该图与生成的地形叠加,沿着这些线有效地降低高度。再加上地形的不规则形状,你可以得到一些不笔直的“原始”河流

    接下来,您可以应用侵蚀过滤器来模拟雨水、水流和侵蚀,以获得更真实、更平滑的河流和湖泊

    这应该让你开始


    有关更多信息,请访问,例如此页面:,或此水模拟(水文地质学):

    虽然Freeciv不在Java中,但它有一个相当可调的随机地形网格生成核心,您可能希望仔细阅读

    有来源;我没有看到它的公共存储库,只是随便搜索一下


    或者,您可以考虑使用,因为这些方法往往会产生非常好的伪现实效果。

    生成高度贴图的一种简单而好的方法是。有关完整的教程和伪代码,请参见本文。

    最常用的分形地形生成技术将正方形或三角形细分,但Robert Krten在其文章“生成真实地形”中描述了一个有趣的替代方法,该文章发表在1994年7月的“Dobb博士的期刊”上:


    简而言之,地形从一个完全平坦的高度地图开始。依次应用较小的断层,其中随机线一侧的所有元素都会升高。平滑过程模拟最后的侵蚀。

    对于我来说,地形生成是一个多步骤的过程

    (1)从圆顶等基本形状开始,每次都可以以相同的方式生成。或者,你也可以用Voronoi板块做实验,在发生碰撞的地方,能级上升。也看看柏林噪音

    (2a)使用降雨模拟侵蚀。河流侵蚀可以通过球体沿地形斜坡“滚动”来模拟。当水滴流过节点时,会带走一小块土地,从而降低土地的高度

    水滴的下一步去向取决于相邻节点或瓷砖之间高程的最低负变化。在每一轮侵蚀,甚至下降后,你可以使地形平滑,这样将来的下降将知道在哪里下降

    当你的水滴从斜坡上滚下时,它们最终需要找到一个停止点。最现实、最耗时的方法是找出洪水的水位,以形成湖泊和海洋。一种更快的方法是让液滴随着时间的推移而减小,并在达到零时停止

    (2b)生成侵蚀水流图。这有利于河流的生成。其基本思想是找到流的边缘点。可以有多个径流点,但必须并行处理河流生成算法。该算法的基本思想是

    start out by making directed graph(s) for water flow:
        push the edge points onto a stack as seeds;
        while stack is not empty:
            pop a node;
            mark node as visited;
            randomly select a number of backflow forks (1 to 3 usually works);
            select up to that number of unvisited nodes, depending on which are unvisited;
            // this can be done randomly or based on the height of primitive terrain;
            make links from popped node to selected fork nodes;
            push the selected fork nodes;
    
    now simulate flow volume:
        initialize a flow-volume value for each node or tile to be zero;
        for each tile on the map:
            push tile on to a stack;
            while the node stack is not empty:
                pop a node;
                increment the node's flow volume by 1;
                push any backflow neighbors;
    
    可以使用水量图确定侵蚀量(挖土深度和半径)。或者,您可以使用它预先编写drop flow 2a算法的脚本。不过,您必须更改有向图圆弧的方向

    (3)侵蚀后,您可以在地形上施加轻微的噪音,以获得摇摆感。我发现随机圆半径的加法混合是一种有用且快速的方法。你也可以使用比你的基本地形更高八度的柏林噪音。请记住,模糊会使你的斜坡变得柔和,而噪音会使事情变得更加尖锐

    这将给你一个稍微体面的地形。如果你想走得更远,你可以看看湖水一代和悬崖一代。您还必须决定是否需要其他特征,如火山口、拱门、台地和塔楼

    分形海岸线和河流也值得研究。我会拿到曼德布罗特关于这个问题的所有书籍和论文。尽管他的工作可以应用于计算机科学和数学的更大范围,但他在地形生成方面有着丰富的信息