我正在编写一个随机地图生成器,并不太确定如何随机生成逼真的景观.我正在使用这些地方规模的地图,这会带来一些有趣的问题.
最简单的案例之一是森林:
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