В объектном файле волнового фронта (.obj), как я должен отрисовывать лица с более чем 4 вершинами в OpenGL?
Итак, используя объектный файл wavefront, как определено здесь: http://en.wikipedia.org/wiki/Wavefront_.obj_file
Как я должен отрисовывать лица, которые имеют более 4 вершин в OpenGL. Я согласен, что если у него 3 вершины, я использую GL_TRIANGLES, если у него 4, я использую GL_QUADS, но если у него 5 или более, что я должен использовать? Есть ли стандарт? в моем поиске в интернете я ничего не смог придумать, и примеры открытого кода GL, которые я нашел, поддерживают только до 4 вершин.
3 ответа
OBJ экспортеры будут экспортировать вершины в правильном порядке для каждого лица (против / по часовой стрелке), и пока ваши лица копланарны и выпуклы (что должно быть кроваво!) - вы можете использовать GL_TRIANGLE_FAN.
Я не согласен с утверждением Николя Боласа о том, что у граней всегда должно быть 3 вершины, хотя и дурак, если ваши полигоны следуют приведенным выше правилам, используя GL_TRIANGLE_FAN
упрощает ваш код и уменьшает потребление системной памяти. Ничто не изменит сторону GPU, так как полигоны все равно будут разложены на треугольники.
Во-первых, вы должны указать любому инструменту экспорта не экспортировать грани с таким количеством вершин. Лица должны иметь 3 вершины, точка.
Если ваш инструмент экспорта не может этого сделать, тогда ваш инструмент загрузки должен разбить полигоны на 3 грани вершин. Я совершенно уверен, что библиотека Asset Importer может это сделать.
Запись в википедии на wavefront-obj говорит, что лица должны быть копланарными и выпуклыми, но я не могу найти такое объявление в исходной спецификации OBJ.
Если лицо копланарное и выпуклое, вы можете использовать GL_TRIANGLE_FAN или GL_TRIANGLE и вручную оценить вентилятор. Веер имеет все треугольники, разделяющие первую вершину. Как это:
// manually generate a triangle-fan
for (int x = 1; x < (faceIndicies.Length-1); x++) {
renderIndicies.Add(faceIndicies[0]);
renderIndicies.Add(faceIndicies[x]);
renderIndicies.Add(faceIndicies[x+1]);
}
Если лицо копланарное, но вогнутое, необходимо выполнить триангуляцию лица с помощью алгоритма, такого как метод обрезания ушей.
http://en.wikipedia.org/wiki/Polygon_triangulation
Если лицо не копланарное, вы облажались, потому что OBJ не сохраняет достаточно информации, чтобы знать, для чего предназначалось тесселяция.