Сначала вы генерируете свои координаты в регулярной сетке в интервале [-pi .. + pi], [-pi / 2 .. + pi / 2]
size_t sizeX = 10;
size_t sizeY = 10;
//Generate 10x10 coordinates in interval [-pi .. +pi] , [-pi/2 .. +pi/2] , 0
std::vector<Point3>vertices(sizeX * sizeY);
for (size_t j=0; j< sizeY; j++)
for (size_t i=0; i< sizeX; i++)
vertices[j*sizeX+i] = Point3(-pi + 2*i*pi/(sizeX-1), -pi/2 + j*pi/(sizeY-1), 0);
В этой сеткевершина, каждая строка имеет элементы sizeX. Это означает, что для вершины с индексом IDX:
- Вершина справа будет иметь индекс IDX + 1
- Вершина над ней будет иметь индекс IDX + sizeX.
Теперь давайте перейдем к треугольникам. Проще использовать схему, основанную на четырехугольниках. Четырехугольник с нижним левым углом в вершине IDX соединится с вершиной IDX + 1, IDX + sizeX, IDX + sizeX + 1.
Поняв это, вы делите четырехугольник на два треугольника, используя те же 4 угла. Таким образом, вы программируете вложенную форму для перебора четырехугольников, но вы создаете два треугольника вместо одного четырехугольника. Остерегайтесь ориентации треугольника.
//Generate triangles. Use a schema based in quads
std::vector<size_t>indices;
indices.reserve(2*(sizeX-1) * (sizeY-1));
for (size_t j=0; j< sizeY-1; j++)
{
//Set idx to point at first vertex of row j
size_t idx=j*sizeX
for (size_t i=0; i< sizeX-1; i++)
{
//Bottom triangle of the quad
indices.push_back(idx);
indices.push_back(idx+1);
indices.push_back(idx+sizeX);
//Top triangle of the quad
indices.push_back(idx+1);
indices.push_back(idx+sizeX+1);
indices.push_back(idx+sizeX);
//Move one vertex to the right
idx++;
}
}