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 (в виде кода, похожего на куб), чтобы мы могли увидеть, что в нем находится. Чтобы понять, что я имею в виду, взгляните на:
Держу пари, что вы ошиблись показателями.
GL_TRIANGLE_STRIP
имеет1
вершина на треугольник не3
Согласно документу OpenGL Поток вершин
n
длина будет генерироватьn-2
треугольники сGL_TRIANGLE_STRIP
,Файловые индексы 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-сканеров, что они могут сохранять такие файлы, но после перезагрузки не могут отображать цвета...