У меня есть двумерный массив с плавающей точкой под названием «Высота» (на данный момент это просто случайные значения от 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;
}
Все, что я прочитал, говорит, что это должно работать.Но получающиеся плитки ландшафта имеют прямые линии между четырьмя углами независимо от того, сколько вершин составляют сетку.Это как использование линейной интерполяции.Я не могу понять, что я делаю неправильно.