почему не работает моя бикубическая интерполяция? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть двумерный массив с плавающей точкой под названием «Высота» (на данный момент это просто случайные значения от 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;
    }

Затем я создаю вершины для каждой плитки методом рисования (для простоты я опустил части, связанные с определением треугольников, нормалей и 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;
    }

Все, что я прочитал, говорит, что это должно работать.Но получающиеся плитки ландшафта имеют прямые линии между четырьмя углами независимо от того, сколько вершин составляют сетку.Это как использование линейной интерполяции.Я не могу понять, что я делаю неправильно.

...