随机地形生成

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

在此处输入图像描述

我怎样才能让它变得更加真实,如湖泊和河流?

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

我不能详细介绍,但我会为你提供谷歌的一些提示:

  1. voronoi图
  2. 侵蚀filter

对于河流,您可以创建一个voronoi图,在光单元之间有细细的暗线。 你可以有一些从暗到亮的渐变,以实现平滑过渡。 然后,您可以使用生成的地形多样化该图表,从而有效地降低这些线条的高度。 加上地形的不规则形状,你可以获得一些非直线的“原型” – 驱动器。

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

这应该让你开始。

欲了解更多信息,请访问VTerrain.org ,例如本页: http : //vterrain.org/Elevation/Artificial/ ,或者用于水模拟(水文地质学): http : //vterrain.org/Water/index.html #Hydrogeology

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

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

或者,您可能会考虑使用遗传算法进行地形生成 ,因为这些算法往往会产生非常好的伪现实结果。

生成高度图的一种简单方法是Diamond-Square算法 。 有关完整的教程和伪代码,请参阅有关生成随机分形地形的文章。

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

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

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

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

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

您可以使用水量图来确定侵蚀量(挖掘的深度和半径)。 或者,您可以使用它来预先编写drop flow 2a的算法。 您必须更改有向图弧的方向。

(3)侵蚀后,你可以在地形上施加轻微的噪音。 我发现随机圆半径的添加剂混合物是一种有用且快速的方法。 您也可以使用比您用于基础地形更高八度的Perlin噪音。 只记得模糊会使你的斜坡软化,噪音会让事情更加清晰。

这会给你一个不错的地形。 如果你想更进一步,你可以看看湖泊生成和悬崖生成。 您还需要决定是否需要其他function,如陨石坑,拱门,台地和塔。

分形海岸线和河流也值得研究。 我会得到Mandelbrot关于这个主题的所有书籍和论文。 尽管他的工作可以应用于更大范围的计算机科学和数学,但他有大量关于地形生成的信息。