在对应于邻居的区域内随机选择点,避免无限递归

3
抱歉,文字有点多。稍后我会添加图片。我需要生成一个立方米体素的相对真实地图,包括水、沙子、草、树木、矿物、沙漠、海滩、岛屿等,但不能使用任何Voronoi剪裁(即要聪明地将这些因素联系起来)。是的,这是一个游戏。
我想随机生成关键点并插值它们以获得高度和湿度读数,但我在随机生成方面一无所知。基本上,我需要一个相当均匀分布的点列表,而不必一次性生成完整的列表。我需要每次生成大约20x20x20个点,并且可能需要处理大约1000x1000x1000个关键点单元格,但我希望在大单元格的边缘发生奇怪的事情。有没有人知道以这种方式选择点的方法?真正的问题在于点应该更喜欢靠近其他点,以"山脉"风格链的形式。
问题在于这是在这些1公里的单元格中发生的。
我可以简单地在单元格内选择点,但由于单元格及其相邻单元格需要相互依赖,我的简单算法会遇到需要无限扩展的单元格之一,或者看到破碎链条的网格模式。链条不应在单元格边界处更频繁地断裂。如果它们这样做,生成中将显示出一种有问题的晶片状图案,并且对于设计/游戏玩法原因而言是无法使用的不良生成。
n.b. 对于这些目的,系统级随机生成器可以被种子化并且实际上是均匀的。至于单元格内部,我可以很好地选择链条。
我还考虑让单元格溢出到任何未生成的单元格,以便其链条开始连接到现有的链条,但这将打破基于位置和种子的确定性生成,增加了生成顺序作为一个因素。
再次强调,为了实现真实感和设计,我试图避免使用Perlin。或者我应该发布在 gamedev.SE 上?

那么,问题在于独立生成单元会导致单元边界处的不连续性? - Raedwald
@Raedwald 没错。 - nanofarad
1个回答

2
关键概念是在填充单元格之前创建单元格和其六个相邻单元格之间的接口。可以将整个世界想象成一个空心框架盒子的网格,但在此之前,要先将它作为线框轮廓创建出来,而在此之前,又要先创建线框交叉点的网格。
这里提供一种简单的方法,但需要改进。首先,考虑一次生成整个世界的方法:
1.选择所有顶点体素——例如每个单元格中的上部左侧体素,并根据位置和种子设置其合理的世界属性值。
2.选择连接顶点的体素行,并根据位置和种子填充它们的世界属性,但必须限制在每端与现有顶点体素值匹配。
3.选择描述由现有行界定的面的体素平面,并填充其中的所有世界属性,基于位置和种子,但必须限制在边缘沿着现有线体素值与之匹配。
4.根据位置和种子填入单元格,但必须限制在与现有六个界面相匹配。
现在,考虑到这种方法不需要一次完成所有步骤。必要的是,在填充单元格之前创建单元格的所有六个面,并在填充面之前创建所有四个边界线,并在填充之前创建两个端点。在第一个单元格后,其中一些将已经存在。
我说你需要改进这个想法的原因是它会在单元格边界产生明显的渐变边界。恐怕每个接口体素不仅需要包含世界属性,还需要包含在该点接口处每个属性的变化率。这意味着每个线体素都必须包含每个属性的两个变化率,每个顶点则需要三个。
我不会描述如何约束世界属性的梯度,因为我相信您可以处理,我的答案已经太长了,而且我不知道该怎么做。

"顶点体素"。这里有一个小问题。我不是逐个生成体素的。我正在选择随机点,并且需要在体素附近(大约40个)的所有点来生成它。虽然这听起来很有趣,但可能会有些复杂。 - nanofarad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接