程序生成的地形不与邻近地形对齐

Procedural generated terrain not lining up with neighboring terrain

我使用 CoherentNoise 库创建了在 Unity 中生成的程序地形。生成本身工作得很好,添加到场景中的每个地形对象都正确生成高度图并应用它们。问题是我生成的噪声从地形对象到地形对象不是连续的,如下图所示。

下面列出了为每个地形对象生成噪声的函数

public void GenerateHeightMap() {
    for (int z = 0; z < zRes; z++) {
        for (int x = 0; x < xRes; x++) {
            var xCoord = (float)((size.x * position.x) + x) / (xRes - 1);
            var zCoord = (float)((size.z * position.z) + z) / (zRes - 1);

            var value = settings.GetModule().GetValue(xCoord, zCoord, 0);
            heights[x, z] = (float)(value / 2f) + 0.5f;
        }
    }
}

快速解释xCoordzCoord

首先这些x和z坐标找到它们的起始生成位置(size * position)。然后他们添加循环偏移(x 或 z)并除以地形分辨率。理论上,这应该允许噪声生成器获取相邻地形对象的 x、z 坐标和 return 对齐的高度图。

关于为什么这些地形游戏对象不排列的任何想法?

如果有人想看一下整个项目,我已经将项目上传到 Github 那里可以查看和下载。

有些可疑,因为你的前提不成立

In theory, this should allow the noise generator...

如果你的前提是正确的,那么如果你计算一个坐标,比如说 zCoord 对于两个相邻的图块,它应该是相等的。

所以,假设 position=(0,0),z=zRes(循环的最后一个 z 元素之后的理论索引) 并与 position(0, 1), z=0.

进行比较

在一种情况下,您最终会得到 zCoord=zRes / (zRes-1),而另一种情况会得到 zCoord=size.z / (zRes-1)。因此存在差异。

试试这样的(不好意思,我在出差,没统一试试):

public void GenerateHeightMap() {
    for (int z = 0; z < zRes; z++) {
        for (int x = 0; x < xRes; x++) {
            var xCoord = (float)((size.x * position.x) + x * size.x/xRes) / (xRes - 1);
            var zCoord = (float)((size.z * position.z) + z * size.z/zRes) / (zRes - 1);

            var value = settings.GetModule().GetValue(xCoord, zCoord, 0);
            heights[x, z] = (float)(value / 2f) + 0.5f;
        }
    }
}

我的程序地形生成代码最近遇到了类似的问题,这就是它解决我的不连续问题的方法:

public void GenerateHeightMap() 
{
  for (int z = 0; z < zRes; z++) 
  {
    //         ratio                    annotation1          annotation2
    var zCoord=((float)z/(float)zRes) + (position.z/size.z)*((zRes-1)/zRes); // place the zCoord here so the calculation won't be repeated (zRes-1) times
    for (int x = 0; x < xRes; x++) 
    {
      var xCoord=((float)x/(float)xRes) + (position.x/size.x)*((xRes-1)/xRes);
      var value = settings.GetModule().GetValue(xCoord, zCoord, 0);
      heights[x, z] = (float)(value / 2f) + 0.5f;
    }
  }
}

注释1: 一个按大小划分位置以标准化坐标 (例如:pos(200,50) size(50,50) 表示在这个地形和原点之间有 4 个地形沿 x 轴和 1 个地形沿 z 轴)

注释2: 地形的相对坐标不会从 0 到 1, 但是从 0 到几乎 1(因为 z 只到(zRes-1))。