【问题标题】:Procedurally Generated Structures over large quantitys of chunks in 3D Terrain Generator3D 地形生成器中大量块的程序生成结构
【发布时间】:2014-01-21 03:09:59
【问题描述】:

我正在使用 16*16*16 体素块创建大型世界,这些体素块的尺寸堆叠最大为 32*32*32,可以这么说,我遇到了一些障碍。

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

结构可以是城镇、地牢和道路等任何东西。我在想像 perlin worms 这样的道路,然后将它们放在 x、z 的地形上,然后分析桥梁等的路径。

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

我对此进行了一些思考,并有 2 种可能的解决方案。

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) 向下、向北和向东寻找一个可能带有小圆锥的房间,并尝试在它们之间创建一条走廊。

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

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

【问题讨论】:

    标签: c# terrain procedural-generation


    【解决方案1】:

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

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

    在这个类上提供了两个方法来生成结构。

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

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

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

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

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

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

    【讨论】:

    • 这和我想的差不多。我明白了,是的,谢谢。查询块时的性能开销是多少。我的意思是,如果游戏决定创建选定块中的结构的一部分,那么帧率会下降到什么程度?
    • 嗯,第一个块自然会命中。但是之后就很顺利了。您可以缓存所有内容,因此当您跨越图块边界时,只需添加范围内的新提供程序。对于我在 Minecraft 中得到的东西,我什至没有注意到我的开发机器上。它还没有在现场,所以我没有用户反馈。
    • 直播时给我发消息我很想试试看它的“感觉”
    • 抱歉公开发帖,但我没看到如何给你发私信。我将 SDHistoryMod 的 alpha 版本发布到 ocean-of-storms.com/vote4joe。您可以选择一个更新的并与 Forge172 一起使用。它不依赖于任何其他模组,但它是 Biomes-o-Plenty 感知的,并且会在存在时使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2018-05-29
    • 2010-09-07
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多