【发布时间】:2016-05-20 16:33:58
【问题描述】:
我正在使用 three.js 通过 Perlin Noise 创建程序生成的地形。
我正在使用一系列块创建地形,但它们沿边界的高度并不对应,如下所示。
我应该如何跨块匹配高度图?
我正在使用 Perlin 噪声算法生成高度;问题是每个点的高度都与附近点的高度无关。我有其他噪声算法,但我有同样的问题..
【问题讨论】:
标签: javascript three.js terrain heightmap
我正在使用 three.js 通过 Perlin Noise 创建程序生成的地形。
我正在使用一系列块创建地形,但它们沿边界的高度并不对应,如下所示。
我应该如何跨块匹配高度图?
我正在使用 Perlin 噪声算法生成高度;问题是每个点的高度都与附近点的高度无关。我有其他噪声算法,但我有同样的问题..
【问题讨论】:
标签: javascript three.js terrain heightmap
这里有一个关于无限地形的非常好的视频:https://www.youtube.com/watch?v=IKB1hWWedMk
它正在处理中,但相同的概念可以应用于您正在使用的任何噪声库 - 我将假设您正在使用 Perlin 噪声。在这种情况下,您需要查看传递给此函数的值并根据块的大小进行更改。
例如,想象一个 3x3 的方块网格。如果你的中间块是 (x, y),并且每个块的大小是 10x10 单位,如果你移动“北”(因为没有更好的术语),你需要得到 (x, y - 10) 从你的噪音函数。
该视频比我解释得更好,但希望这会有所帮助。如果不了解您正在使用的功能,我真的无法给出更详细的答案。
【讨论】:
这个答案将解释如何解决单轴 x。然后对 y(three.js 中的 z)轴做同样的事情是微不足道的。
第一步是确保 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 是块的宽度/大小,以三个.js 为单位。
最后,您需要为噪声函数提供相同的偏移量,但根据上述映射进行缩放。在此示例中,512 将变为 0.5,1536 将变为 1.5,如下所示:
size = 1024;
vertextHeight = perlin((vertexX + offsetX) / size, (vertextY + offsetY) / size)`
因此,在block0和block 1之间的边缘给噪声函数的x值将相同,因此将返回相同的高度值。
【讨论】: