用Perlin蠕虫产生洞穴


12

我目前正在尝试使用3D Simplex Noise生成类似于Minecraft的体素地形,并且还希望实现洞穴。

我在线程中找到了Perlin Worms的方法,该方法产生了非常好的结果。但是,我不知道如何逐块生成它。这是否可能,或者有其他替代方法可以逐块地产生类似洞穴的蠕虫吗?

编辑:是我不知道如何解决的问题。

编辑2:是将2D脊状多重分形噪声与“单纯形噪声”高度图组合而成的结果。仍然需要一些调整,但这几乎是我想要的结果。感谢Byte56。


如果可能,应使用直接公式生成地形。如果您可以仅基于体素的坐标来计算体素,而无需有关相邻像素的信息,那么块不再是问题。如果要使用perlin蠕虫(我想不能单独计算每个体素),请查看链接问题的可接受答案中的最后一段。
danijar

1
基本上,这是我的问题。仅给出坐标即可轻松计算基本地形,但无论是否有洞穴,我都不知道如何计算。
user000user 2013年

Answers:


5

大多数Perlin噪声算法都可以让您在任何给定位置检索噪声值,例如noise(x,y,z)。这使得在逐块的基础上生成噪声相当简单。您需要做的就是传递全局位置,而不是块位置。

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

可以看到,我们通过遍历块边界并检查该全局位置是否稳定来为块生成地形。通常,这可能与您用于生成地形的方法相同。

perlinNoise.get占据全球位置并返回其密度。在哪里isSolid可以做一个简单的测试来查看体素是否“足够稠密”以适合固体。

perlinNoise.get可能比简单的噪声算法还要复杂。您可以根据自己世界中体素的深度进行检查。例如,如果体素低于您确定的“绝对基础地平面”,则可以使用perlin蠕虫算法返回密度,如果其高于绝对基础,则可以使用常规密度函数为您提供更多样化的地形。我建议在两者之间进行一些融合。

结合使用不同的Perlin杂讯功能只是您必须尝试并了解有效的方法。最好设置您的环境,以便您可以更改某些值并热交换地形,而无需重新加载游戏。尝试愉快。


2
感谢你的回答。但是,我不知道如何使用“常规” Perlin或Simplex Noise创建蠕虫状的洞穴。它们是球形的,沿一个方向缩放或不是很长。对于Perlin Worms算法,我不知道如何确定当前位置是否在蠕虫内部,而又不知道头部位置。
user000user 2013年

1
蠕虫算法不依赖于知道“头部位置”。用您的话来说,看来您的问题不在于逐块产生噪声。关于实现Perlin蠕虫所链接的问题,有一些教程。在这里可以找到如何生成“常规”地形。
MichaelHouse

使用3D Simplex Noise进行基本地形生成的效果很好,但是我不知道如何确定块内蠕虫的位置/段。据我了解,您给蠕虫一个头部位置和n个段,并使用噪声函数计算这些段之间的角度。这是一张可以更好地解释我的问题的图像:link
user000user 2013年

2
有不同类型的噪音。使用头部位置并从那里跟随是一种方法。如果您在本页底部附近浏览,您会发现一些杂音,这些杂音会产生您想要的那种杂音,而无需首先放置头部。
MichaelHouse

感谢您的提示。但是,我实现了3D脊形多重分形噪声,其结果令人非常不满意。我将尝试将其与2D高度图结合在2D中,然后再次报告。这可能会创建更多蠕虫状的洞穴。
user000user 2013年

3

我认为这是在Minecraft中的工作方式。每个蠕虫都有一个最大长度(我们称之为M)。每个蠕虫的头都是根据组块位置计算的。渲染每个块时,必须检查M半径内的所有块,并跟踪其所有蠕虫。就性能而言,它并不理想,但确实可以。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.