Как следует из названия, я пытаюсь создать тесселяцию патча BSpline, используя список треугольников.
Вот изображение моего патча спереди, которое выглядит именно так, как должно.
Моя проблема в задней части патча, который дает этот эффект:
Как вы можете видеть, предыдущий ряд треугольников соединяется с новым строящимся рядом. Я пробовал различные способы избежать этого, такие как увеличение значения индекса на 1, когда оно достигает конца строки. Единственное быстрое решение, которое я смог найти, — это поместить каждую строку в отдельный цикл (с диапазоном цикла, потому что размер этой строки), что вовсе не интуитивно понятно.
Вот код для рисования моего патча:
void drawBSplinePatch1(std::vector<int>& sample_elements_out, const int samples)
{
for(int i = 0; i <= 379; i++)
{
// first triangle
sample_elements_out.push_back(i);
sample_elements_out.push_back(i + 1);
sample_elements_out.push_back(i + samples);
// second triangle
sample_elements_out.push_back(i + samples);
sample_elements_out.push_back(i + 1);
sample_elements_out.push_back(i + samples + 1);
}
}
Пропустить квад для каждой строки, например, как это.
for(int i = 0; i <= 379; i++)
{
if (i % ROW_LENGTH != ROW_LENGTH - 1) {
// first triangle
sample_elements_out.push_back(i);
sample_elements_out.push_back(i + 1);
sample_elements_out.push_back(i + samples);
// second triangle
sample_elements_out.push_back(i + samples);
sample_elements_out.push_back(i + 1);
sample_elements_out.push_back(i + samples + 1);
}
}
Тем не менее, два вложенных цикла, вероятно, будут более читабельными.
Других решений пока нет …