程序生成的地形不与邻近地形排列

时间:2015-11-12 21:29:22

标签: c# unity3d procedural-generation

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

9 Terrain GameObjects that don't lineup

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

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坐标找到它们的起始位置(大小*位置)。然后他们添加循环偏移(x或z)并除以地形的分辨率。理论上,这应该允许噪声生成器抓取相邻地形对象的x,z坐标并返回排列的高度图。

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

如果有人想看一下整个项目,我已将项目上传到Github,可在其中查看和下载。

2 个答案:

答案 0 :(得分:2)

有些东西可疑,因为你的前提并不存在

  

理论上,这应该允许噪声发生器......

如果你的前提是正确的,那么如果你计算一个坐标,让两个相邻的瓷砖说zCoord,它应该是相等的。

所以,让我们说position =(0,0),z = zRes(循环的最后一个z元素之后的理论索引) 并与位置(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;
        }
    }
}

答案 1 :(得分:0)

我最近遇到了类似程序地形生成代码的问题,这就是我如何修复我的不连续性问题:

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;
    }
  }
}

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

annotation2: 地形的相对坐标不会从0变为1, 但从0到差不多1(因为z只到(zRes-1))。