三维地形发生器中大量块的程序生成结构

时间:2014-01-21 03:10:00

标签: c# terrain procedural-generation

我正在使用16 * 16 * 16体素块创建大型世界,这些块的尺寸最多可叠加到32 * 32 * 32,而且我在路上碰到了一点凹凸无遗。

我想创建大小超过20 + * 20 + * 20 +块的大型结构,这些结构是从程序生成的结构创建的,并且使用某些内容的模板。现在我有一个问题。视觉渲染范围高达32 * 32 * 32块,而我尽可能在内存中保存40 * 40 * 40个块。

结构可以是城镇,地下城和道路。我正在考虑类似道路的柏林蠕虫,并将它们放在x,z的地形上,然后分析桥梁的路径等。

结构和结构集合需要在玩家处于视觉范围之前预先生成,或者更像是高度图的perlin噪声(最佳解决方案)。 (以避免玩家看到发电机在工作)。他们每次都需要与世界种子保持一致。

我已经考虑过这个问题并且有两种可能的解决方案。

1)根据结构生成器的原点生成结构。 这导致了几个问题,尽管即使我从结构的中心生成,结构也可以很容易地进入玩家的潜在视觉范围。

2)预先生成“不可到达”块,然后将它们进出页面以便使用上述方法生成结构。 这似乎也没必要。

两种方法都需要大量分析地形以获得有效位置以产生结构。

我希望有人可能有更有机的解决方案,甚至只是一个更简单的解决方案,不需要我“向前看”。

提前谢谢。

编辑:

我对地牢生成有一个想法,我在其中为房间生成点云/节点。 步骤进行:

1)当生成器找到“节点”时,它会创建一个x,y和z大小,以创建一个框,从房间的起始点**(房间的中心或角落)和房间类型开始。

** x,y,z相对于0,0,0世界空间计算如此new Vector3((chunkX*16)+voxelX,(chunkY*16)+voxelY,(chunkZ*16)+voxelZ)

2)计算一个房间大小后,检查是否有重叠,如果找到一个,请做几件事之一。 如果房间重叠高,则向下降低,直到屋顶或地板齐平。如果屋顶是齐平的,则建造一个通往房间的楼梯并移除相交的墙壁。

3)向下看,北方和东方的房间可能有一个小锥体,并试图在它们之间建立一个走廊。

这可能会有所作为,特别是如果地牢的中心是主厅/老板房。

这对于城镇,城市和地下城区来说会有所不同。尽管看起来仍然有些不稳定。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我遇到了类似我正在撰写的Minecraft mod的问题。我希望有一些重叠的“帝国”,每个“帝国”都会创造出结构。但我不希望这些结构相互衔接。

所以,为此,我把世界打成了任意大小的瓷砖。 (与你的32x32x32区域相比。)我也提出了“影响半径”。这距离它可以创建结构的中心点有多远。每个磁贴都有一个为其分配的提供程序类的实例,并带有唯一的种子。

为此类提供了两种方法来生成结构。

首先,是一个将返回的函数,它想要创建结构。但只有大块的解决方案。 (与您的16x16x16块集相比。)每个提供者类实例都有一个优先级,因此,如果两个提供者试图在同一个块中对一个结构进行rezz,则优先级较高的一个将获胜。

第二个函数将传递一个世界实例,并且第一个函数返回的一个数据项将被要求实际创建它。

所有东西都拼凑在一起:

我们收到了解决世界某一部分的请求。我们计算了块所在的tile的提供者,然后计算了该tile的最大半径范围内的所有tile的所有提供者。我们现在拥有可以影响这一块的每个提供商。我们在每个函数上调用第一个函数,如果它们尚未被调用,并将它们中的每个块声明注册到全局映射中。

此时,我们已经咨询了可能影响这一块的所有内容。然后我们询问注册表是否有人声称这个块。如果是这样,我们使用chunk和world实例回调到该提供者(方法#2),并让它为这部分结构绘制位。

这是否足以让您对问题的一般方法有所了解?