2016-07-13 6 views
1

Я рендеринга полигона в OpenGL с массивом вершин, который называется vertices, и индексным буфером final под названием DRAW_ORDER с обмоткой CCW. У меня включена функция отбрасывания назад, и я делаю обратные вызовы с использованием glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER).Как восстановить порядок намотки CCW после отражения вершин по оси x или y?

Когда я отражаю vertices по оси x или y через матричное преобразование, полигон отбирается, потому что отражение меняет ориентацию вершин, так что они больше не соответствуют порядку намотки CCW DRAW_ORDER.

Я могу предотвратить проблему, отключив отбраковывание, но для повышения эффективности я предпочел бы найти способ восстановить ориентацию vertices через перестановку. Например, если многоугольник был треугольником, я мог бы просто поменять вторую и третью вершины после отражения, чтобы восстановить ориентацию CCW. Как я могу распространить этот подход на многоугольник с произвольным числом вершин и индексов?

//PSEUDO-CODE FOR TRIANGLE: 
    final DRAW_ORDER = {0,1,2}; 
    vertices = { {0,0}, {1,0}, {0,1} }; 
    reflect(vertices); 
    swap(vertices,1,2); 

EDIT: Вот решение, которое, кажется, работает для выпуклых многоугольников, но не вогнутая.

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

Вы можете видеть на изображении ниже, как решение работает для эллипса (который является выпуклым), но не звезда (которая является вогнутой).

enter image description here

+0

Непосредственно отвечая на ваш вопрос, но вы рассматривали использование 'glFrontFace (GL_CW)', чтобы указать, что ваши лицевые грани имеют порядок намотки CW? –

+0

Да, но тогда мне нужно будет отслеживать, какой порядок намотки у каждого полигона есть, и каждый раз, когда изменяется обмотка, происходит вызов gl. К тому моменту, когда я это делаю, я полагаю, что я мог бы полностью отключить отбраковку. – William

+0

Это не соответствует описанию проблемы в вашем вопросе. В этом вопросе вы говорите, что порядок намотки изменяется, потому что вы применяете отражение в преобразовании. Теперь вы говорите, что у каждого полигона может быть другой порядок намотки? –

ответ

0

Чтобы инвертировать порядок обхода путем перестановки индексов, вы можете просто изменить порядок индексов.

Итак, для вашего примера треугольника, если исходный порядок (0, 1, 2), обратный порядок (2, 1, 0). Так как все циклические подстановки эквивалентны для определения многоугольника, то другие действительные порядки будут (1, 0, 2) и (0, 2, 1). Но использование обратного так же хорошо, как и все.

В качестве другого примера, для многоугольника с 5 вершинами, используя индексы (3, 17, 6, 8, 11), обратное (11, 8, 6, 17, 3), которое может использоваться как набор индексов, когда вы хотите отобразить многоугольник с противоположным порядком обмотки.

+0

Ваше решение работает, но мне бы очень хотелось найти решение, которое переставляет вершины вместо индексов. Таким образом, у меня мог бы быть статический окончательный буфер индекса, который разделяет все мои многоугольники определенного типа. – William

 Смежные вопросы

  • Нет связанных вопросов^_^