请原谅文字墙。我稍后会添加图像。我需要生成一张有点逼真的立方米体素地图,包括水、沙子、草、树木、矿物、沙漠、海滩、岛屿等,没有任何 voronoi 应付(即聪明地将这些因素相互关联)。是的,这是一个游戏。
我想我会随机生成临界点并插入它们以获得海拔和湿度读数,但我对随机生成感到茫然。基本上,我需要稍微均匀的点分布,而不必一次列出完整列表。我需要一次生成大约 20x20x20,并且可能需要处理大约 1000x1000x1000 个临界点的单元格,但我预计在大单元格的边缘会发生奇怪的事情。有谁知道以这种方式选择点的方法?真正的问题是,点应该更喜欢靠近"山脉"式链中的其他点。
这里的问题是,这发生在这些 1 公里的单元中。
我可以简单地在单元格内以这种方式选择点,但由于单元格及其邻居需要相互依赖,我的简单算法会遇到需要前往无穷大以找到其中一个单元格,或者看到断链的网格状图案。链不应在细胞边界上更频繁地断裂。如果他们在一代中做了一些有问题的晶圆状图案,那么一代就出现了糟糕的一代,由于设计/游戏原因无法使用。
注:注:出于这些目的,系统级随机生成器可以播种并且实际上是均匀的。就单元格内而言,我可以很好地选择链。
我还考虑过让一个细胞溢出到任何未生成的细胞中,这样它的链就开始连接到现有的细胞,但这会打破仅仅基于位置和种子的生成决定论,增加生成顺序作为一个因素。
同样,出于现实主义和设计的目的,我试图避免使用Perlin。还是我应该在 gamedev.SE 上发帖?
关键概念是在填充单元格之前在单元格及其所有六个邻居之间创建接口。 想象一下,将你的整个世界创建为一个空心盒子的网格,但在你这样做之前,把它创建一个线框轮廓,但在你这样做之前,创建线框交叉点的网格。
这是一个简单的方法 - 你必须改进这一点。 首先,考虑一下生成整个世界的方法:
(1) 选择所有顶点体素(可能是每个像元中的西北上体素),并将其世界属性设置为完全基于位置和种子的合理值。
(2) 选择连接顶点的体素线,并根据位置和种子填充其所有世界属性,但必须与两端的现有顶点体素值匹配。
(3) 选择描述以现有线为界的面的体素平面,并根据位置和种子填充其所有世界属性,但约束为与沿边的现有线体素值匹配。
(4)根据位置和种子填充单元格,但约束与现有的边界六个面匹配。
现在,请考虑此方法不需要一次完成所有操作。 所需要的只是在填充单元格之前创建单元格的所有六个面,在填充之前创建面的所有四个边界线,并在填充之前创建线条的两个端点。 在第一个单元格之后,其中一些将已经存在。
我说你必须改进这个想法的原因是它在细胞边界处产生了明显的梯度边界。 恐怕每个界面体素不仅需要包含世界属性,还需要包含每个属性在那个时候跨界面的变化率。 这意味着每个线体素必须包含每个属性的两个变化率,每个折点必须包含三个变化率。
我不打算描述当世界属性接近具有预定义渐变的体素时如何约束它的梯度,因为我相信你可以处理它,我的答案已经太长了,我不知道怎么做。