Я пытаюсь смоделировать объект, описанный в файле 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 вершин, но они по-настоящему странны.
Я довольно смущен, и я даже не уверен, что делаю это правильно. Может быть, кто-то может поправить меня в правильном направлении?
Спасибо, будет ли это работать для более сложных трехмерных фигур, или есть лучший способ их рендеринга? – jacobappleton
Это более или менее то, как все получается. Иногда может использоваться «GL_TRIANGLE_STRIP», но для этого требуется некоторая работа по настройке. Вы должны правильно составить список индексов и все. –