对于基于分形的程序化城市布局,有什么好的算法?


19

背景

我运行的是我的世界服务器,在这里我将设计一个规模相当大的入门城市。我有一系列东西,例如尺子标志和暴民笼子,我想在那儿放建筑物。这个城市本身将非常庞大且分布广泛,最大规模可达1000 x 1000街区。

建筑物本身将具有基于某个基本立方体的立方体或矩形足迹,例如3块的所有倍数。街道和建筑物之间的距离最好为5-11块宽,具体取决于街道的重要性。

当我开始制定城市规划时,我将确切地知道我想要多大的建筑物以及将要建造的建筑物。

问题

问题在于设计城市的布局。显然,由于规模如此之大,而且我来自编程领域而不是城市规划者背景,因此即使开始思考这个问题也颇具挑战。

具体来说,问题是我希望这座城市看起来尽可能自然。当然,在简单的网格模式上构建起来会相当容易,但是我要尽可能避免使用网格或任何看起来像网格的东西。

问题

我可能会追求哪些算法来帮助我使用代码进行设计?我当时以为,如果我以某种方式使用分形,那将是最自然的,因为我的世界在地形生成中已经使用了分形,而一个城市似乎自然以分形的方式成长。

我认为它在某种程度上与俄罗斯方块播放算法相似,因此,如果有人在该方向上存在解决方案,那么它也会有所帮助。我在想象可以在其中定义我要使用的形状的东西,然后该软件进行迭代,直到找到最“最佳”的解决方案来均匀分配建筑物。 是否已经存在帮助我使用python(最好是使用pygame以可视方式)解决此问题的方法?

自然,这在整个游戏设计中也对城市一代产生了有趣的影响,因此我很高兴看到最佳解决方案是什么。

编辑 为了清楚起见,我现在正在寻找布局,因为建筑物将在游戏中设计和建造。


3
我的世界使用分形吗?我的印象是它仅使用连续噪声函数(我相信Perlin或Simplex)。
Martin Sojka

@Martin Sojka Perlin的噪音实际上是分形的,所以在那儿。
没关系

1
@Nevermind:分形的定义特征是自相似性:如果选择它的一部分并将其缩放到原始大小,它将是“相似的”(具有相同的结构)。特别地,分形信号的频谱对于标度是不变的。如果您使用Perlin杂讯来做到这一点,您将获得的只是Perlin杂讯的放大区域。频谱也会发生变化。
马丁·索伊卡

@Nevermind Perlin噪声实际上不是分形的,但是布朗运动(可以使用Perlin噪声的一种技术)是分形的,通常称为Perlin噪声。
埃尔瓦,

是的,很抱歉,当人们混淆Perlin噪音和粉红色噪音时,我总是会纠正他们,但在这里我自己也犯了同样的错误。我唯一的辩解是,Minecraft实际上也使用了粉红色(布朗运动)噪声,IIRC。
没关系,

Answers:


20

我最近为程序化城市布局实现了一种算法。这项工作仍在进行中,但对我来说似乎很有希望。看一看:

程序城市示例

用于创建此布局的算法大致基于L-Systems。我有一个基Element类,它有一个标记其在地图上位置的矩形和一个方法Grow,该方法Elements在矩形内部创建另一个对象,和/或在地图上生成一些对象。再就是实际元素,从这个基类继承:CityStreetBuilding等。

生成从许多“种子”对象开始(在我的情况下,只是一个City随机放置在地图上的元素)。然后系统对所有元素进行迭代,调用Grow,直到所有元素变为非活动状态(Grow返回false),或进行大量迭代。

图片中的城市仅使用一些简单规则即可构建:

  • City成为Street在某处分割区域的元素。
  • 所有Street的人都在0-3条小街上成长,进一步分裂了该地区。
  • 另外,Streets会不断尝试Building在侧面安装随机尺寸。

结果并不十分有趣,但也不错。该系统可以轻松扩展,并且足够简单以了解发生了什么(-8


喜欢简单。我猜城市实际上是有机的,因为它们是由有机实体控制的-它试图在其心灵的眼中创造完美-使L-Systems可能是此过程的最佳近似。
乔纳森·迪金森

我喜欢。=)现在要在pygame中实现...

8

此GDC谈话程序上一代的建筑从几年前。它用于基于一组模板创建单个建筑物,而不用于创建整个城市(布置街道等)。不幸的是,它没有免费的代码。演讲中描述的系统是在Unreal中实现的,尽管我不清楚它是否在UDK的免费版本中。无论如何,您都可以使用某些相同的想法来构建自己的系统。

谷歌搜索“过程性建筑物”或“过程性城市”也将为您提供有关该主题的其他许多论文和文章。


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.