2

请原谅文字墙。稍后我会添加图像。我需要生成一个有点现实的立方米体素地图,包括水、沙子、草、树木、矿物、沙漠、海滩、岛屿等,没有任何形式的 voronoi 应对(即聪明地将这些因素与每个其他)。是的,这是一个游戏。

我想我会随机生成临界点并将它们插入以获取海拔和湿度读数,但我对随机生成感到茫然。基本上我需要一个稍微均匀的分数分布,而不必一次列出完整的列表。我需要一次生成大约 20x20x20,并且可能使用大约 1000x1000x1000 个临界点单元格,但我预计在大单元格的边缘会发生奇怪的事情。有谁知道以这种方式选择点的任何方法?真正的麻烦在于,点应该更接近“山脉”风格链中的其他点。

这里的问题是,这发生在这些 1 公里的小区中。

我可以简单地在一个单元格中以这种方式选择点,但是由于一个单元格及其邻居需要相互依赖,所以我的简单算法会遇到需要前往这些单元格中的一个无穷大,或者看到类似网格断链的模式。链不应在单元边界上更频繁地断裂。如果他们在生成过程中显示了一些有问题的类似晶圆的图案,并且由于设计/游戏玩法的原因而导致无法使用的糟糕的生成。

nb 出于这些目的,系统级随机生成器可以播种并且实际上是统一的。就一个单元格而言,我可以很好地选择链。

我还考虑过让一个细胞溢出到任何未生成的细胞中,以便它的链开始连接到现有的细胞,但这会破坏仅基于位置和种子的生成确定性,将生成顺序作为一个因素。

同样,出于现实主义和设计的目的,我试图远离使用 Perlin。还是我应该在gamedev.SE上发帖?

4

1 回答 1

1

关键概念是在填充单元之前创建单元与其所有六个邻居之间的接口。将您的整个世界想象成一个空心盒子的网格,但在此之前,将其创建为线框轮廓,但在此之前,请创建线框交叉点的网格。

这是一个简单的方法——你必须改进它。首先,考虑一下这种一次生成整个世界的方法:

(1) 选择所有顶点体素——也许是每个单元格中的上西北体素——并完全基于位置和种子将其世界属性设置为合理的值。

(2) 选择连接顶点的体素线,并根据位置和种子填充它们的所有世界属性,但限制为与每一端现有的顶点体素值匹配。

(3) 选择描述以现有线为界的面的体素平面,并根据位置和种子填充它们的所有世界属性,但限制为与沿边缘的现有线体素值匹配。

(4) 根据位置和种子填充单元格,但要与现有的六面边界相匹配。

现在,考虑到这种方法不需要一次全部完成。只需在填充之前创建一个单元格的所有六个面,在填充之前创建一个面的所有四个边界线,然后在填充之前创建一条线的两个端点在第一个单元格之后,其中一些将已经存在。

我说你必须改进这个想法的原因是它会在单元格边界处产生明显的渐变边界。恐怕每个界面体素不仅需要包含世界属性,还需要包含当时界面中每个属性的变化率。这意味着每个线体素必须包含每个属性的两个变化率,每个顶点三个。

我不打算描述当世界属性接近具有预定义渐变的体素时如何约束它的渐变,因为我相信你可以处理它,我的答案已经太长了,我不知道如何.

于 2013-10-13T05:59:02.857 回答