随机地形生成

时间:2011-12-21 16:27:06

标签: java

如何制作出更逼真地形的地形生成器? 我当前的生成器生成这种类型的地形:

enter image description here

如何才能让它成为更加真实的地形,如湖泊和河流?

5 个答案:

答案 0 :(得分:6)

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

我无法详细介绍,但我会为您提供一些谷歌提示:

  1. voronoi diagrams
  2. 侵蚀过滤器
  3. perturbation
  4. ...
  5. 对于河流,您可以创建一个voronoi图,在光细胞之间有细细的暗线。你可以有一些从暗到亮的渐变,以实现平滑过渡。然后,您可以使用生成的地形多次绘制该图表,从而有效地降低了这些线条的高度。加上地形的不规则形状,你可以获得一些非直线的“原型”。

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

    这应该让你开始。

    有关详细信息,请访问VTerrain.org访问,例如此页面:http://vterrain.org/Elevation/Artificial/或此用于水模拟(水文地质):http://vterrain.org/Water/index.html#Hydrogeology

答案 1 :(得分:1)

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

http://sourceforge.net/projects/freeciv/有消息来源;在偶然的搜索中,我没有看到它的公共存储库。

或者,您可以考虑使用genetic algorithm for terrain generation,因为这些会产生非常好的伪现实结果。

答案 2 :(得分:1)

生成高度图的一种简单方法是Diamond-Square algorithm。有关完整的教程和伪代码,请参阅Generating Random Fractal Terrain上的这篇文章。

答案 3 :(得分:0)

最常用的分形地形生成技术细分了正方形或三角形,但Robert Krten在他的文章“生成现实地形”中描述了一个有趣的选择,发表于1994年7月的“Dobb博士期刊”:< / p>

http://drdobbs.com/architecture-and-design/184409269

简而言之,地形始于一个完全平坦的高度图。应用连续较小的故障,其中随机线的一侧上的所有元件都变得更高。平滑过程模拟最终的侵蚀。

答案 4 :(得分:0)

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

(1)从像圆顶这样的原始形状开始,可以每次以相同的方式生成。或者,您也可以尝试使用Voronoi板并在发生碰撞的位置提高水平。还可以看看Perlin Noise。

(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;

您可以使用水量图来确定要侵蚀的量(挖泥的深度和半径)。或者,您可以使用它来编写掉流2a的算法的脚本。不过,您必须更改有向图弧的方向。

(3)侵蚀后,可以将光噪声应用于地形以实现岩石状态。我发现随机圆半径的加法混合是一种有用且快速的方法。您还可以使用八度音阶的Perlin噪声高于用于基本地形的八度。请记住,模糊会软化您的斜坡,而噪点会使情况变得更清晰。

这将为您提供一个不错的地形。如果想走得更远,可以研究湖泊和悬崖的产生。您还必须决定是否要使用其他功能,例如陨石坑,拱门,台面和塔楼。

分形的海岸线和河流也值得研究。我只会得到曼德布洛特(Mandelbrot)关于该主题的所有书籍和论文。尽管他的工作可以应用于更广泛的计算机科学和数学领域,但他仍然提供了大量有关地形生成的信息。