2

我正在使用 16*16*16 体素块创建大型世界,这些体素块的尺寸堆叠高达 32*32*32,可以这么说,我在路上遇到了一些颠簸。

我想创建跨越 20+*20+*20+ 体积块的大型结构,这些结构是从程序生成的结构中创建的,并且对某些内容使用模板。现在我有一个问题。视觉渲染范围最多为 32*32*32 块,而我在内存中一次可能最多保存 40*40*40 块。

这些结构可以是城镇、地牢和道路之类的任何东西。我在想像 perlin worms 这样的道路,只是将它们放在 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) 向下、向北和向东看可能有一个小圆锥的房间,并尝试在它们之间创建一条走廊。

这可能会起作用,特别是如果地牢的中心是大厅/老板房间。

对于城镇、城市和地牢来说,情况会有所不同。不过似乎还是有点波澜不惊。有任何想法吗?

4

1 回答 1

1

对于我正在编写的 Minecraft 模组,我遇到了类似的问题。我希望有许多重叠的“帝国”,每个都创建结构。但我不希望这些结构相互踩踏。

因此,为此,我将世界分成任意大小的瓷砖。(与您的 32x32x32 区域相比。)我还提出了“影响范围”。这是它可以创建结构的中心点的距离。每个图块都有一个分配给它的提供者类的实例,并带有唯一的种子。

该类提供了两种用于结构生成的方法。

首先,是一个函数,它会返回它想要创建结构的地方。但仅限于块的分辨率。(与您的 16x16x16 块集相比。)每个提供者类实例都有一个优先级,因此在两个提供者试图在相同的块中重新调整结构的情况下,较高优先级的将获胜。

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

一切都像这样拼凑在一起:

我们收到一个请求来解决世界的某个部分。我们计算出块所在的瓦片的提供者,然后计算出该瓦片最大半径内的所有瓦片的所有提供者。我们现在拥有每个可能影响这个块的提供者。如果它们还没有被调用,我们调用它们中的每一个的第一个函数,并将它们各自声明的块注册到全局映射中。

在这一点上,我们已经咨询了所有可能对这个块产生影响的东西。然后我们询问该注册中心是否有人认领了这个块。如果是这样,我们用块和世界实例回调该提供者(方法#2),并让它为其结构的这一部分绘制位。

这是否为您提供了足够的想法来解决您的问题的一般方法?

于 2014-05-09T17:23:23.550 回答