使用块生成程序地形

时间:2016-05-20 16:33:59

标签: javascript three.js terrain heightmap

我正在使用three.js使用Perlin Noise创建程序生成的地形。

我使用一系列块创建地形,但是它们沿边界的高度并不相互对应,如下所示。

我应该如何在块之间匹配高度贴图?

terrain blocks

我使用Perlin噪声算法生成高度;问题是每个点的高度与近点的高度无关。我有其他噪音算法,但我有同样的问题..

2 个答案:

答案 0 :(得分:0)

这里有一个关于无限地形的非常好的视频:https://www.youtube.com/watch?v=IKB1hWWedMk

它正在处理中,但是相同的概念可以应用于您正在使用的任何噪声库 - 我将假设您正在使用Perlin噪声。在这种情况下,您需要查看传递给此函数的值,并根据块的大小来更改它们。

例如,想象一个3x3网格的块。如果你的中间块是(x,y),并且每个块的大小是10x10单位,如果你移动'北'(因为没有更好的术语),你需要得到(x,y - 10)你的噪音功能。

视频解释得比我好,但希望这有帮助。如果不了解您正在使用的功能,我无法给出更详细的答案。

答案 1 :(得分:0)

此答案将说明如何求解单轴x。然后,对于y轴(在three.js中为z)执行相同的操作很简单。

第一步是确保perlin噪声对每个块使用相同的随机种子。这样可以确保这些块共享相同的Perlin噪声图,从而可以在它们之间平滑过渡。

第二部分是在块单元和传递给perlin噪声函数的块之间进行映射。例如,您的块x可能从-512到512单位,因此您可以通过将每个x顶点的-0.5到0.5传递给噪波函数来获得每个x顶点的高度值。 例如。 vertextHeight = perlin(vertexX / 1024, vertextY / 1024)

然后,您的第二个块将偏移,以便其边缘与第一个块交接。例如。它的x位置将比第一个块多+1024,因此它将从512变为1536。 因此,从这个意义上讲,block0的x偏移量为0,block1的x偏移量为1024。1024是块宽度/大小,以three.js为单位。

最后,您需要为噪声函数赋予相同的偏移量,但需要根据上述映射进行缩放。在此示例中,512将变为0.5,而1536将变为1.5,如下所示:

size = 1024;
vertextHeight = perlin((vertexX + offsetX) / size, (vertextY + offsetY) / size)`

因此,在块0和块1之间的边缘处,赋予噪声函数的x值将相同,因此将返回相同的高度值。