我正在使用 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) 向下、向北和向东看可能有一个小圆锥的房间,并尝试在它们之间创建一条走廊。
这可能会起作用,特别是如果地牢的中心是大厅/老板房间。
对于城镇、城市和地牢来说,情况会有所不同。不过似乎还是有点波澜不惊。有任何想法吗?