Как нарисовать набор горизонтальных линий? - PullRequest
1 голос
/ 24 марта 2011

Я новичок в OpenGL в качестве учебного упражнения. Я решил нарисовать набор горизонтальных линий из сетки матрицы m x n, содержащей местоположения вершин

Это то, что у меня есть enter image description here

и если я использую LINE_STRIP enter image description here

Фрагмент кода, использующий массивы и индексы вершин, будет отличным, я не могу понять концепцию только из учебника, который мне нужно увидеть, и поиграть с примером кода Любая помощь будет высоко ценится!


@ Томас Получил работу со следующим кодом

totalPoints = GRID_ROWS * 2 * (GRID_COLUMNS - 1);
indices = new int[totalPoints];

points = new GLModel(this, totalPoints, LINES, GLModel.DYNAMIC);
int n = 0;
points.beginUpdateVertices();
for ( int row = 0; row < GRID_ROWS; row++ ) {
  for ( int col = 0; col < GRID_COLUMNS - 1; col++ ) {
    int rowoffset = row * GRID_COLUMNS;
    int n0 = rowoffset + col;
    int n1 = rowoffset + col + 1;

    points.updateVertex( n, pointsPos[n0].x, pointsPos[n0].y, pointsPos[n0].z );
    indices[n] = n0;
    n++;

    points.updateVertex( n, pointsPos[n1].x, pointsPos[n1].y, pointsPos[n1].z );
    indices[n] = n1;
    n++;
  }
}
points.endUpdateVertices();

Затем я обновляю и рисую, выполняя

points.beginUpdateVertices();
for ( int n = 0; n < totalPoints; n++ ) {
   points.updateVertex( n, pointsPos[indices[n]].x, pointsPos[indices[n]].y, pointsPos[indices[n]].z );
}
points.endUpdateVertices();

Это результат

enter image description here


Исправьте это, изменив вложенный цикл for

for ( int col = 0; col < GRID_COLUMNS; col++ ) {
for ( int row = 0; row < GRID_ROWS - 1; row++ ) {
    int offset = col * GRID_ROWS;
    int n0 = offset + row;
    int n1 = offset + row + 1;
    indices[n++] = n0;
    indices[n++] = n1;
  }
}

Теперь я могу иметь любое количество строк и столбцов

Спасибо, Агин!

1 Ответ

4 голосов
/ 24 марта 2011

Вам нужно нарисовать линию для каждого сегмента и повторно использовать индекс, то есть для первой части вы бы нарисовали линию для (0,1), (1,2), (2,3) и так далее.

Edit:

Предположим, у вас есть массив 4x5 (4 строки, 5 вершин в строке). Затем вы можете рассчитать индексы следующим образом (псевдокод):

Vertex[] v = new Vertex[20]; // 20 vertices in the grid
for(int row = 0; row < numrows; row++) // numrows = 4
{
  int rowoffset = row * numcols ; //0, 4, 8, 12
  for(int col = 0; col < (numcols - 1); col++) //numcols = 5
  {
     addLineIndices(rowoffset + col, rowoffset + col +1); //adds (0,1), (1,2), (2,3) and (3, 4) for the first row
  }
}

Затем выполните вызов отрисовки для numrows * (numcols - 1) сегментов строки (GL_LINES), то есть 16 в примере. Обратите внимание, что addLineIndices будет функцией, которая добавляет пару индексов для одного отрезка строки в массив индексов, который затем передается в вызов отрисовки.

...