C ++ Нарисуйте треугольную полосу, используя для цикла - вершины, индексы - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь нарисовать плоскость, используя треугольные полосы. Я понимаю, как сделать это вручную, но я действительно изо всех сил пытаюсь сделать это, используя цикл for. Пока что код ниже рисует два треугольника. enter image description here

//vertices for triangle strip
vertices.push_back(Point3(0,0,0));
vertices.push_back(Point3(1,0,0));
vertices.push_back(Point3(1,1,0));
vertices.push_back(Point3(0,1,0));
vertices.push_back(Point3(-1,1,0));
vertices.push_back(Point3(-1,0,0));


// indices into the arrays above for the first triangle
indices.push_back(0);
indices.push_back(1);
indices.push_back(2);    
// indices for the second triangle
indices.push_back(0);
indices.push_back(2);
indices.push_back(3);    
//indices for the third triangle
indices.push_back(5);
indices.push_back(0);
indices.push_back(3);    
//indices for the fourth triangle
indices.push_back(5);
indices.push_back(3);
indices.push_back(4);

Мне нужно нарисовать 100, переходя от -pi к pi на x, и от -pi / 2 до pi / 2 на y. Есть ли более простой способ пройти через эти значения и получить вершины и индексы? Спасибо за любую помощь!

Отредактировано, чтобы добавить: я пошел слева направо вручную, но это не имеет значения в любом случае.

enter image description here

1 Ответ

0 голосов
/ 14 ноября 2019

Сначала вы генерируете свои координаты в регулярной сетке в интервале [-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 угла. Таким образом, вы программируете вложенную форму для перебора четырехугольников, но вы создаете два треугольника вместо одного четырехугольника. Остерегайтесь ориентации треугольника.

enter image description here

//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++;
    }
}

...