为什么我的双三次插值不起作用?

时间:2018-12-16 07:33:17

标签: c# math smoothing

我有一个称为“海拔”的二维浮点数组(暂时只是从0到1的随机值) 我想使用三次三次插值法为每个海拔高度样本生成1个平滑地形图块。

我正在使用以下方法进行数学运算:

    private float CubicPolate(float v0, float v1, float v2, float v3, float position)
    {
        float A = (v3 - v2) - (v0 - v1);
        float B = (v0 - v1) - A;
        float C = v2 - v0;
        float D = v1;

        return A * Mathf.Pow(position, 3) + B * Mathf.Pow(position, 2) + C * position + D;
    }

然后我使用draw方法为每个图块创建顶点(为简单起见,我省略了与定义三角形,法线和UV相关的部分):

private void draw(int xCoord, int yCoord)
    {
        List<Vector3> newVerts = new List<Vector3>();

        float[,] ndata = new float[4, 4];
        for (int X = 0; X < 4; X++)
            for (int Y = 0; Y < 4; Y++)
                ndata[X, Y] = Altitude[xCoord + (X - 1), yCoord + (Y - 1)];

        for (int x = 0; x <= resolution; x++)
        {
            float fracx = x / resolution;
            float x1 = CubicPolate(ndata[0, 0], ndata[1, 0], ndata[2, 0], ndata[3, 0], fracx);
            float x2 = CubicPolate(ndata[0, 1], ndata[1, 1], ndata[2, 1], ndata[3, 1], fracx);
            float x3 = CubicPolate(ndata[0, 2], ndata[1, 2], ndata[2, 2], ndata[3, 2], fracx);
            float x4 = CubicPolate(ndata[0, 3], ndata[1, 3], ndata[2, 3], ndata[3, 3], fracx);

            for (int y = 0; y <= resolution; y++)
            {
                float fracy = y / resolution;
                newVerts.Add(new Vector3(fracx, CubicPolate(x1, x2, x3, x4, fracy), fracy));
            }
        }

        Mesh newMesh = new Mesh();
        newMesh.vertices = newVerts.ToArray();
        meshFilters[xCoord, yCoord].mesh = newMesh;
    }

我读过的所有内容都说这应该可行。但是,所得的地形图块在四个角之间具有直线,而与构成网格的顶点数无关。就像使用线性插值一样。我不知道自己在做什么错。

0 个答案:

没有答案