【问题标题】:Procedural terrain generation with blocks程序地形生成与块
【发布时间】:2016-05-20 16:33:58
【问题描述】:

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

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

我应该如何跨块匹配高度图?

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

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow。请通过article 了解如何提出一个好问题。此外,显示您尝试过的代码将有助于其他人更好地回答您的问题。
  • 您需要向我们展示您现在的表现。你是如何产生噪音的?噪音2d?噪音3d? HERE 是我做的嘈杂顶点位移的快速演示,也许有帮助?

标签: javascript three.js terrain heightmap


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    这个答案将解释如何解决单轴 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值将相同,因此将返回相同的高度值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      相关资源
      最近更新 更多