Как восстановить порядок намотки против часовой стрелки после отражения вершин на оси x или y?
Я рендеринг многоугольника в OpenGL с массивом вершин под названием vertices
и final
индексный буфер называется DRAW_ORDER
с намоткой против часовой стрелки. У меня включена выборка задних граней, и я делаю вызовы отрисовки, используя glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER)
,
Когда я размышляю vertices
по оси x или y с помощью преобразования матрицы многоугольник отбраковывается, потому что отражение меняет ориентацию вершин, так что они больше не соответствуют порядку намотки против часовой стрелки: DRAW_ORDER
,
Я могу предотвратить проблему, отключив отбраковку, но для повышения производительности я бы лучше нашел способ восстановить ориентацию vertices
через перестановку. Например, если бы полигон был треугольником, я мог бы просто поменять местами вторую и третью вершины после отражения, чтобы восстановить ориентацию против часовой стрелки. Как я могу распространить этот подход на многоугольник с произвольным числом вершин и индексов?
//PSEUDO-CODE FOR TRIANGLE:
final DRAW_ORDER = {0,1,2};
vertices = { {0,0}, {1,0}, {0,1} };
reflect(vertices);
swap(vertices,1,2);
РЕДАКТИРОВАТЬ: Вот решение, которое, кажется, работает для выпуклых многоугольников, но не вогнутый.
//Reverse the order of the vertices so, for example,
//vertices {v1,v2,v3,v4,v5} become {v5,v4,v3,v2,v1}
for(int start = 0, end = vertices.length-1; start<end; start++, end--){
swap(vertices,start,end);
}
Вы можете видеть на изображении ниже, как решение работает для эллипса (который является выпуклым), но не для звезды (которая является вогнутой).
1 ответ
Чтобы инвертировать порядок намотки путем перестановки индексов, вы можете просто изменить порядок индексов.
Так что для вашего примера треугольника, если исходный порядок (0, 1, 2), обратный порядок равен (2, 1, 0). Поскольку все циклические перестановки эквивалентны для определения многоугольника, другие действительные порядки будут (1, 0, 2) и (0, 2, 1). Но использование реверса так же хорошо, как и все остальное.
В качестве другого примера, для многоугольника с 5 вершинами, использующего индексы (3, 17, 6, 8, 11), обратным является (11, 8, 6, 17, 3), который можно использовать в качестве набора индексов, когда Вы хотите визуализировать многоугольник с противоположным порядком намотки.