生成随机集群和路径的好方法是什么?

dlr*_*as2 13 random algorithm

我正在编写一个随机地图生成器,并不太确定如何随机生成逼真的景观.我正在使用这些地方规模的地图,这会带来一些有趣的问题.

最简单的案例之一是森林:

                    Sparse  Medium  Dense
Typical trees       50%     70%     80%
Massive trees       —       10%     20%
Light undergrowth   50%     70%     50%
Heavy undergrowth   —       20%     50%
Run Code Online (Sandbox Code Playgroud)

树木和灌木丛可以存在于同一个空间中,因此平均稀疏森林有25%的典型树木和光照灌木,25%的典型树木,25%的光照灌木丛和25%的开放空间.中等和茂密的森林需要更多的思考,但它也不是我的问题所在,因为它都是均匀分散的.

我的问题在于生成集群和路径,同时保持百分比限制.沼泽就是一个很好的例子:

                    Moor  Swamp
Shallow bog         20%   40%
Deep bog            5%    20%
Light undergrowth   30%   20%
Heavy undergrowth   10%   20%
Run Code Online (Sandbox Code Playgroud)

深沼泽广场通常聚集在一起,并被不规则的浅沼泽广场环包围.

还可以存在另外的地图元素,树篱,以及通过沼泽地蜿蜒的开阔地面的路径.这两种类型的地图元素(聚类和路径)都存在问题,因为地图的总构图应该包含元素的X%,但它不是均匀分布的.其他元素,例如溪流,池塘和流沙也需要集群或路径类型生成.

在给定这些约束的情况下,我可以使用哪种技


我正在使用C#,FYI(但这不是C#特定的问题.)

Jus*_* L. 21

现实的"随机"分布通常使用Perlin Noise来完成,可以像你提到的那样使用"clumps"进行分配.它通过对来自随机数据点的多层线性内插值求和/组合来工作.每层(或"八度")的数据点数是最后一层的两倍,并限制在较窄的值范围内.结果是"逼真"的随机纹理.

这是Hugo Elias对Perlin Noise背后理论的一个美妙展示.

这是我在C#中发现Perlin Noise的第一件事.

你可以做的是生成一个Perlin Noise图像并设置一个"阈值",其中任何高于某个值的东西都是"打开",而它下面的所有东西都是"关闭".你最终得到的是事物高于门槛的团块,看起来不规则和令人敬畏.只需将阈值以上的值分配到您想要地形特征的位置即可.

以下是一个程序,如果程序生成Perlin Noise位图,然后随时间调整截止阈值.可以看到清晰的"结块".它可能正是你想要的.

请注意,在阈值较高的情况下,它上面的点很少,而且很稀疏.但是当阈值降低时,这些点会"增长"成块状(根据perlin噪声的性质),并且这些团块中的一些将相互结合,并且基本上创造出非常自然和类似地形的东西.

请注意,您还可以通过设置Perlin Noise函数的"湍流"来设置"丛集因子"或特征聚集的趋势,这基本上会导致PN函数的峰值和波谷更加突出并且更加接近.

现在,在哪里设置门槛?阈值越高,最终地图上要素的百分比越低.阈值越低,百分比越高.你可以搞砸他们.您可以通过摆弄一些小数学来获得精确的百分比(似乎值的分布遵循正态分布 ;我可能是错的).调整它直到它恰到好处:)

编辑正如评论中所指出的,您可以通过创建累积直方图(地图的百分比%低于阈值的索引)找到确切的百分比,然后选择能够为您提供所需百分比的阈值.

这里最酷的事情是你可以在这里简单地创建围绕某些其他特征(比如你的沼泽特征)的特征 - 只需使用相同的Perlin Noise映射两次 - 第二次,降低阈值.第一个将是块状的,第二个将在相同区域周围成块,但随着块放大(参考前面发布的flash动画).

至于像树篱这样的其他功能,你可以尝试建模简单的随机游走线,它们比直接转弯更倾向于直线,并将它们随机放置在基于perlin的地图上.


样本

这是一个50x50瓷砖稀疏森林地图示例.灌木丛是棕色的,树木是蓝色的(对不起),以清楚哪个是哪个.

稀疏森林http://img688.imageshack.us/img688/7005/forestmap.png

对于这张地图,我没有确切的阈值来匹配50%; 我只将阈值设置为最大值的50%.从统计数据来看,每次平均精确到50%.但它可能不足以满足您的目的; 请参阅前面的说明,了解如何执行此操作.


以下是您的沼泽特征的演示(为了清晰起见,不包括灌木丛),浅灰色和深沼泽背面:

Marshes http://img202.imageshack.us/img202/5092/marshdemo.png

这只是50x50,所以有一些神器,但你可以看到你可以轻松地从深沼泽中"生长"浅沼泽 - 只需调整相同的Perlin地图上的阈值.对于这个,我用眼球水平来表达最令人满意的结果,但为了你自己的目的,你可以做前面提到的.

这是一张从相同的Perlin Noise地图生成的沼泽地图,但是在250x250平铺地图上展开:

沼泽250x250 http://img251.imageshack.us/img251/2867/marshdemo250.png