OpenGL вершины и индексы для волнового фронта

Я создал свои вершины, цвета и индексы, которые будут отображаться с помощью openGL. Вот исходные коды для отображения вершин, цветов и индексов.

//CODES TO SET VBO....
void displayCallback() {    
    glVertexPointer(...);
    glColorPointer(...);
    glDrawElemnts(GL_TRIANGLE_STRIP,...);
}

Как видите, индексы будут построены как GL_TRIANGLE_STRIP и будут отображены. После рендеринга я хочу сохранить объектный файл wavefront с данными о вершинах, индексах и цветах.

Я пытался сделать файл.obj таким.

for(int i = 0; i < vertexSize; ++i) {
    fprintf(fp, "v %f %f %f\n", vertices[i*3], vertices[i*3+1], vertices[i*3+2]);
}

fprintf("fp, "s 1\n");

for(int i = 0; i < indexSize; ++i) {
    fprintf(fp, "f %d %d %d\n", indices[i*3], indices[i*3+1], indices[i*3+2]);
}

Я попытался повторно открыть его с помощью Assimp Viewer, ( http://www.assimp.org/) он не смог загрузить. Я что-то пропустил?

Благодарю.

1 ответ

Решение

Пожалуйста, добавьте простой пример файла obj (в виде кода, похожего на куб), чтобы мы могли увидеть, что в нем находится. Чтобы понять, что я имею в виду, взгляните на:

Держу пари, что вы ошиблись показателями.

  1. GL_TRIANGLE_STRIP имеет 1 вершина на треугольник не 3

    Согласно документу OpenGL Поток вершин n длина будет генерировать n-2 треугольники с GL_TRIANGLE_STRIP,

  2. Файловые индексы Wavefront начиная с 1

    Так что вы скорее всего индексируете из 0 так что проверь... и используй +1 или нет соответственно.

Я не знаю вашу архитектуру / топологию структуры данных, но, по моему мнению, ваши лица должны быть сохранены следующим образом (не проверено, так как у меня нет ваших массивов / таблиц и модели), помещенных вместе в № 1, № 2:

fprintf(fp, "f %d %d %d\n", indices[0]+1, indices[1]+1, indices[2]+1);
for(int i = 3; i < indexSize; i++) 
 fprintf(fp, "f %d %d %d\n", indices[i-2]+1, indices[i-1]+1, indices[i]+1);

Цветовые данные

Для этого волнового фронта obj использует расширения материалов в отдельных файлах mtl,stl (я не знаком с теми, кто сожалеет...), но в настоящее время 3D-сканеры используют недокументированное цветовое кодирование непосредственно в файлах obj (поддерживается некоторыми зрителями), это делается так:

v -5.231932 438.659877 -432.038039 0.000000 1.000000 0.000000

Так что если вершина имеет 6 координирует первый 3 являются x,y,z и последний 3 являются r,g,b поэтому куб из связанного ответа, окрашенный в красный цвет, будет

v -1.0 -1.0 -1.0 1 0 0
v +1.0 -1.0 -1.0 1 0 0
v +1.0 +1.0 -1.0 1 0 0
v -1.0 +1.0 -1.0 1 0 0
v -1.0 -1.0 +1.0 1 0 0
v +1.0 -1.0 +1.0 1 0 0
v +1.0 +1.0 +1.0 1 0 0
v -1.0 +1.0 +1.0 1 0 0

f 1 2 3 4 
f 5 6 7 8 
f 1 2 6 5 
f 2 3 7 6 
f 3 4 8 7 
f 4 1 5 8 

Вы можете попробовать его в своей программе просмотра, чтобы проверить, поддерживает ли он такое кодирование... Я видел в некоторых недорогих приложениях для 3D-сканеров, что они могут сохранять такие файлы, но после перезагрузки не могут отображать цвета...

Другие вопросы по тегам