2012-01-28 2 views
0

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

Я не очень разбираюсь в разборе файла, я полагаю, что эта часть будет довольно прямолинейной. На этом этапе я просто пытаюсь жестко закодировать массив вершин и индексный массив, чтобы я мог хорошо понять, как это работает, чтобы я мог обобщить для любого входного файла 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 вершин, как epected в том, что, если правильно вершины были объединены с строками, представляли бы ожидаемый ящик (кроме точки в середине, но когда я использую 26 как аргумент count, тогда точка в середине исчезает)

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

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

ответ

0

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

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

+0

Спасибо, будет ли это работать для более сложных трехмерных фигур, или есть лучший способ их рендеринга? – jacobappleton

+0

Это более или менее то, как все получается. Иногда может использоваться «GL_TRIANGLE_STRIP», но для этого требуется некоторая работа по настройке. Вы должны правильно составить список индексов и все. –

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

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