程序化河流或道路生成,可实现无限地形


28

我应该说的是道路,而不是道路,因为我认为这更像中世纪。另外,不要寻找现实主义。我正在寻找的答案将是适合我描述的模型,而不是现实。

我正在寻找一种以弯曲的方式生成程序性道路/河流的方法,但我想针对无限的地形类型系统来这样做。就像佩林噪声如何产生斑点一样,我想生成随机长度的线段(可能是无限长)。

我知道类似此处找到建议答案的策略,但是它依赖于指定的起点和终点才能工作,但我没有指定的起点和终点。我希望能够简单地使用任意坐标调用函数,并让其返回特定坐标是否为河流/道路的一部分。

我不想要求预先生成地形。其中包括一个高度图(例如用于降雨模拟或类似方法)。我也不想要求起点/终点。

是否有这样的算法或对噪声算法进行了调整,有人可能会知道这些算法来完成我要解释的事情?

到目前为止,如果我使用的名称正确,则最接近的是多脊形分形。我只是获取噪声值的绝对值(假设将其缩放为-1到+1)并设置一个阈值。我的主要问题是,线条重叠的方式太频繁了,大多是圆形的,有时会收敛形成大湖,这些湖泊整洁但并不理想,而且线条的厚度经常变化太大。

这是我到目前为止在2D模式下的图片,但是以很高的频率显示了更多细节:

在此处输入图片说明


由于河流是“水流”,因此可以简单地通过使用噪声来确定原点来确定河流,然后再使用原始的高度图数据来确定路径。
战争

不过,道路可能会更具挑战性,我考虑了根据使用情况来建造道路,如果一个玩家/所有玩家定期在某个地形上行走,它将变成一条小路。
战争

1
@ user19142好,那么不能重复。您可能还会从此问题/答案中找到一些用处:gamedev.stackexchange.com/questions/53400/…而且我将再次包含先前的链接作为“相关” gamedev.stackexchange.com/questions/45403/…gamedev 。 stackexchange.com/questions/29044/... gamedev.stackexchange.com/questions/31263/...
MichaelHouse

4
我认为,如果产生噪音,道路将不太可靠。道路是由智能而非物理和时间创造的。尽管它们有时可能彼此相似,但它们之间的差异足够大,以至于您可能无法对两者使用相同的算法。
MichaelHouse

1
该项目中的道路是遵循特定高度的等高线,因此您可以在本地生成它们。它在那里工作,但是高度图不是由Perlin噪声生成的。
阿米特

Answers:


11

我的想法是在没有(非常)预先计算的情况下存档您想要的内容,并且没有无限的可能性。

该算法的第一个方面是Voronoi-Diagramms的用法。您将世界划分为网格,每个网格的地址形式(xgrid,ygrid)确实存在。对于需要在其中创建道路的每个单元,将xgrid和ygrid变量放入一个哈希函数中,该哈希函数返回数字CellSeed。您可以将CellSeed用作随机数生成器的种子,该生成器将生成Voronoi图的点的坐标。

现在,您需要搜索图的边缘以及多个边缘碰撞的节点。您也可以将信息存储到图形中以更轻松地访问。

完成此步骤后,您可以搜索网络中有效的路径。

对于有效路径,您现在可以创建道路(它们确实具有锐利的边缘)。

注意:您还需要为所有倍增单元格生成Voronio图的坐标,因此在单元格的边缘没有边框。

如果您不希望使用尖锐的边缘,则可以计算每个连接的中点,并使用该方向作为图形中两个边缘之间的贝塞尔曲线插值的切线。

关于Voronoi-Diagramms的用法

要归档类似道路结构的城市,可以将伪随机函数中的点在网格上对齐,因此方式为矩形。

对于更多县级公路,这些点必须更加无序。

维基百科的图表

关于伪随机函数以生成Voronoi图的点的位置

它可以是正常的随机函数,也可以是Hammersley集,以实现更均匀的点的非聚集分布。


你有哈希函数的例子吗?我有相同的目标(在道路上使用voronoi的无限世界),但我似乎无法掌握该如何实现。我能找到的每个voronoi lib都希望边界框的坐标立即失效。
BotskoNet '16

不,哈希函数仅用于向该单元分配一个starteed。可以像x * prime1 + y * prime2 + z * prime3一样琐碎。当质数彼此不相等且理想情况下较大时,此处应使用64位整数/无符号数进行计算。如果lib使用边界框,这不是问题,因为对于每个单元格,您只需要考虑单元格中的所有点以及相邻单元格的所有点(即8个相邻单元格)。
Quonux

如果库使用单精度或使用单精度,则可能会遇到单精度的精度问题。要绕过该问题,如果lib仅使用单精度并且您不执行以下操作:在将位置转换为单精度之前,请从中减去中心单元的全局位置,然后将其作为float放入lib中,然后将结果回来了。
Quonux

我实际上从未实现过这种算法,但是哈希函数确实可以算是微不足道的。
Quonux

8

对于道路(和城市)的创作,我发现的最好的论文是:

Y Parish和PMüller对城市的过程建模

这使用L系统,并且可以生成美国和欧盟的道路模式。如果您不想为整个城市生成道路,则可以生成主要道路。输入中可以包含高度图,水位图和人口密度图。


+1是因为我喜欢这篇论文。确实不适合我想要动态生成地形的道路/路径/河流生成方法。
Mythics 2013年

6

http://vterrain.org/Culture/Roads/部分“生成3D道路”中提供了一些有关道路生成的信息

道路的问题是它们连接地标(尽管它们通常沿着地形行驶,而不是从A直行到B)。

就个人而言,我会生成地形,然后放置河流(也许使用侵蚀,请参阅http://vterrain.org/Water/ “水文地质”部分),然后将城市放置在有意义的地方(例如,在河流或其他地方附近)水源,或可以使用渡槽或水塔和水管将水输送到的地方,并最终在城市之间建立道路。

为了使它在过程世界中更易于使用,您可以在地形中在该位置生成道路的最可能位置上创建中间点,然后在该位置实际创建道路时连接这些中间点。


4

首先,河流和道路截然不同。道路趋于遵循等值线(相同/相似的海拔)-原因是在起伏不大或不大的道路上行驶要容易得多。另一方面,河流垂直于等值线/等高线(下坡)行驶。河流形成于盆地(全部向下流向给定山谷的群山)中,并趋于形成树状结构。另外,道路经常垂直于河流行进,以形成逻辑桥梁。最好的想法是先生成河流,然后创建逻辑道路(即城市之间的道路)。不幸的是,我没有时间详细介绍,但希望这能使您走上正确的道路。

看起来似乎很明显,但请查看各种地形和道路的Google地图;您会更好地了解它们的外观。


1
我再次修改了该问题,以使人们更加理解,我对算法的工作方式不甚满意,对现实主义不感兴趣。尽管如此,我还是很欣赏这个答案,尽管主要是针对某些使用的术语。试着想像我的愿望,就像可以用最少的数据(例如高度图)生成无限随机长度的花键一样。
神话
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.