我目前正在尝试使用3D Simplex Noise生成类似于Minecraft的体素地形,并且还希望实现洞穴。
我在此线程中找到了Perlin Worms的方法,该方法产生了非常好的结果。但是,我不知道如何逐块生成它。这是否可能,或者有其他替代方法可以逐块地产生类似洞穴的蠕虫吗?
编辑:这是我不知道如何解决的问题。
编辑2:这是将2D脊状多重分形噪声与“单纯形噪声”高度图组合而成的结果。仍然需要一些调整,但这几乎是我想要的结果。感谢Byte56。
我目前正在尝试使用3D Simplex Noise生成类似于Minecraft的体素地形,并且还希望实现洞穴。
我在此线程中找到了Perlin Worms的方法,该方法产生了非常好的结果。但是,我不知道如何逐块生成它。这是否可能,或者有其他替代方法可以逐块地产生类似洞穴的蠕虫吗?
编辑:这是我不知道如何解决的问题。
编辑2:这是将2D脊状多重分形噪声与“单纯形噪声”高度图组合而成的结果。仍然需要一些调整,但这几乎是我想要的结果。感谢Byte56。
Answers:
大多数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杂讯功能只是您必须尝试并了解有效的方法。最好设置您的环境,以便您可以更改某些值并热交换地形,而无需重新加载游戏。尝试愉快。