地形生成算法的错误

问题描述

长话短说,以下内容基于mesh generationterrain heights

在我的代码中,一切似乎都很好。我都重做了,还是出现同样的问题,不知道为什么。

我只知道 Z for 循环的最后一次迭代没有给出正确的高度。

enter image description here

我可以只设置 z-1 并让游戏在地图的其余部分运行

enter image description here

但我觉得这会毁了我下一阶段的开发,所以我请求提示问题可能出在哪里。

perlin 噪声的代码如下

public static class PerlinFilter
{
    public static float[] Filter(List<int> keyX,List<int> keyZ,int indexX = 0,int indexZ = 0,int sizeX = 100,int sizeZ = 100,int nOctaves = 3,float fBias = .6f)
    {
        float[] filtered = new float[(sizeX + 1) * (sizeZ + 1)];
        for (int z = indexZ; z < sizeZ; z++)
        {
            for (int x = indexX; x < sizeX; x++)
            {
                float fNoise = 0.0f;
                float fScale = 1.0f;
                float fScaleAcc = 0.0f;

                for (int o = 0; o < nOctaves; o++)
                {
                    int nPitch = sizeZ >> o;
                    int nSampleX1 = x / nPitch * nPitch;
                    int nSampleZ1 = z / nPitch * nPitch;

                    int nSampleX2 = (nSampleX1 + nPitch) % sizeX;
                    int nSampleZ2 = (nSampleZ1 + nPitch) % sizeX;

                    float fBlendX = (float)(x - nSampleX1) / nPitch;
                    float fBlendZ = (float)(z - nSampleZ1) / nPitch;

                    float fSampleT = (1.0f - fBlendX) * keyX[nSampleZ1 * sizeX + nSampleX1] + fBlendX * keyZ[nSampleZ1 * sizeZ + nSampleX2];
                    float fSampleB = (1.0f - fBlendX) * keyX[nSampleZ2 * sizeX + nSampleX1] + fBlendX * keyZ[nSampleZ2 * sizeZ + nSampleX2];

                    fNoise += (fBlendZ * (fSampleB - fSampleT) + fSampleT) * fScale;
                    fScaleAcc += fScale;
                    fScale /= fBias;
                }
                filtered[z * sizeX + x] = fNoise / fScaleAcc;
            }
        }
        return filtered;
    }
}

网格代码如下:

void Generate(bool flat)
{
    vertices = new Vector3[(x + 1) * (z + 1)];

    for (int i = 0,iz = 0; iz <= z; iz++)
    {
        for (int ix = 0; ix <= x; ix++,i++)
        {
            if (flat)
                vertices[i] = new Vector3(ix,iz);
            else
                vertices[i] = new Vector3(ix,PerlinHeight(ix,iz),iz);
        }
    }

    triangles = new int[x * z * 6];

    for (int tris = 0,vert = 0,iz = 0; iz < z; iz++,vert++)
    {
        for (int ix = 0; ix < x; ix++,vert++,tris += 6)
        {
            triangles[tris + 0] = vert + 0;
            triangles[tris + 1] = vert + x + 1;
            triangles[tris + 2] = vert + 1;
            triangles[tris + 3] = vert + 1;
            triangles[tris + 4] = vert + x + 1;
            triangles[tris + 5] = vert + x + 2;
        }
    }
}

public int PerlinHeight(int _x,int _z) => (int)(keyPerlin[_z * x + _x] * 1f);

keyPerlin 是 PerlinFilter.Filter 的结果。

如果很明显我需要在此处添加更多代码,请告诉我,这是在几个月前完成的,我一直在研究游戏的其他部分,同时接受 z-1 解决方法,但在这一点我真的需要解决这个问题。

解决方法

在您的噪声过滤器生成过程中

float[] filtered = new float[(sizeX + 1) * (sizeZ + 1)];
for (int z = indexZ; z < sizeZ; z++)
{
    for (int x = indexX; x < sizeX; x++)
    {
        ...

=> 你没有用有效值填充完整的数组! z== SizeZx==SizeX 的最后一行保持默认值 0

在网格中时

vertices = new Vector3[(x + 1) * (z + 1)];

for (int i = 0,iz = 0; iz <= z; iz++)
{
    for (int ix = 0; ix <= x; ix++,i++)
    {
        ...

=> 您将最后一行顶点全部设置为 0