Использование glDrawElements для рисования объекта из файла WRL (VRML) - PullRequest
0 голосов
/ 28 января 2012

Я пытаюсь смоделировать объект, описанный в файле WRL (VRML), с использованием OpenGL.

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

Ясначала пробуем базовую модель прямоугольной призмы.В настоящее время у меня есть этот массив вершин:

GLfloat vertices[] = {
     -0.200000, -0.025000, -0.050000,
     -0.200000, -0.025000, 0.050000, 
     -0.200000, 0.025000, -0.050000, 
     -0.200000, 0.025000, 0.050000, 
      0.200000, -0.025000, -0.050000,
      0.200000, -0.025000, 0.050000, 
      0.200000, 0.025000, -0.050000, 
      0.200000, 0.025000, 0.050000
};

и индексный массив:

GLubyte indices[] = {
     7, 3, 5, -1, 5, 3, 1, -1,
     6, 2, 7, -1, 7, 2, 3, -1, 
     4, 0, 6, -1, 6, 0, 2, -1,
     5, 1, 4, -1, 4, 1, 0, -1,
     2, 0, 3, -1, 3, 0, 1, -1,
     4, 6, 5, -1, 5, 6, 7, -1
};

, который поступил непосредственно из файла WRL Coordinate3 {point []} и IndexedFaceSet {coordIndex []}.

Затем я включаю функциональность массива вершин, вызывая:

glEnableClientState(GL_VERTEX_ARRAY);

и настраиваю glVertexPointer:

glVertexPointer(3, GL_FLOAT, 0, vertices);

наконец я используюФункция glDrawElements для рисования поля:

glDrawElements(GL_POLYGON, 24, GL_UNSIGNED_BYTE, indices);

и затем деактивация функциональности массива вершин:

glDisableClientState(GL_VERTEX_ARRAY);

Так что после этого я быожидаем, что будет нарисован прямоугольник, и когда я использую glDrawElements(GL_POINTS, 24, GL_UNSIGNED_BYTE, indices);, он показывает 8 вершин, как и предполагалось, что, если бы правильные вершины были соединены линиями, представляло бы ожидаемый прямоугольник (за исключением того, что в середине есть точка, но когдаЯ использую 26 в качестве аргумента подсчета, затем точка в середине исчезает)

Однако, когда я использую GL_POLYGON или GL_LINE_LOOP в качестве первого аргумента для glDrawElements, я получаю мусор.8 вершин, очевидно, есть, но они соединены очень странными способами.

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

1 Ответ

0 голосов
/ 28 января 2012

Прямоугольная призма не является GL_POLYGON. Обратите внимание на единственную форму этого слова: многоугольник. Как в один полигон. Прямоугольная призма состоит из множества полигонов, а не только одного.

То, что вы хотите, это нарисовать GL_TRIANGLES. Создайте список индексов, который показывает каждый из треугольников, составляющих прямоугольник. Это означает, что каждая поверхность ящика состоит из двух треугольников, поэтому вам нужно всего 12 треугольников. Это означает, что 36 индексов.

...