2013-11-19 4 views
0

У меня возникла проблема с отображением всех моих объектов с помощью openGL. У меня есть 5 разных файлов obj: куб, чайник, лампа, мужчина и автомобиль. Куб, лампа и человек рисуют точно, однако чайник и автомобиль не отображаются правильно.Рисунок OBJ-файла с openGL

У меня есть метод, который читается в файле obj, и я сделал распечатки, чтобы проверить, соответствует ли результат файлу obj, и все они правильные.

Вот мой код для розыгрыша() и я думаю, что этот вопрос находится здесь

glBegin(GL_TRIANGLES); 
for(int i = 0; i < f_count; i++){ 
    if(f[i].type == 'c'){ 
     GLfloat * color = new GLfloat[4]; 
     color[0] = f[i].x; 
     color[1] = f[i].y; 
     color[2] = f[i].z; 
     color[3] = 1; 

     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); 
    } 
    else{ 
     glVertex3f(vn[(f[i].vn1-1)].x, vn[(f[i].vn1-1)].y, vn[(f[i].vn1-1)].z); // normals 
     glVertex3f(vn[(f[i].vn2-1)].x, vn[(f[i].vn2-1)].y, vn[(f[i].vn2-1)].z); // normals 
     glVertex3f(vn[(f[i].vn3-1)].x, vn[(f[i].vn3-1)].y, vn[(f[i].vn3-1)].z); // normals 

     glVertex3f(v[(f[i].v1-1)].x, v[(f[i].v1-1)].y, v[(f[i].v1-1)].z); 
     glVertex3f(v[(f[i].v2-1)].x, v[(f[i].v2-1)].y, v[(f[i].v2-1)].z); 
     glVertex3f(v[(f[i].v3-1)].x, v[(f[i].v3-1)].y, v[(f[i].v3-1)].z); 
    } 
} 
glEnd(); 

первые 3 являются нормали, а другой 3 являются вершинами Вот мой файл заголовок с моим Структуры

struct NormalVector 
{ 
    GLfloat x, y, z; 
}; 

struct Vertex 
{ 
    GLfloat x, y, z, w; 
}; 

struct Faces 
{ 
    int v1,v2,v3, vn1,vn2,vn3; 
    char type; 
    GLfloat x,y,z; 
}; 

Я не уверен, что я делаю неправильно или если я делаю что-то неправильно с кодом я представил .. однако это где я «чувствую» ошибка находится.

ОБЪЯСНЕНИЕ:

Vertex * v это указатель вершины VectorNormal * VN нормального вектора указатель Лица * Р лицо указателя

в методе дро(), то петли через F struct pointer и проверяет тип, если он имеет тип цвета, он добавляет glMaterialfv (.., .., ..); Если это не так, то он захватывает индексное значение граней и передает его через указатель на структуру Вершины и указатель векторной структуры Vector Normal.

Вот мой чайник Here is my teapot Вот чайник его предположит выглядеть enter image description here

+0

Есть ли что-нибудь еще, что по-другому о кубе, лампы и человека против чайника и автомобиля? Все объекты загружены из .obj-файлов, и все они должны быть нарисованы с помощью освещения? – svk

+0

почему это было downvoted? – DWolf

+0

Я знаю, что современный OpenGL имеет очень крутую кривую обучения, но немедленный режим (glVertex и т. П.) Устарел с OpenGL 3. – Marius

ответ

3

Вы обеспечиваете нормали через glNormal(), не glVertex().

Также glNormal() только защелкивает состояние. Ничего действительно не отправляется в OpenGL до следующего звонка glVertex(), после чего состояние запертого цвета/нормального/положения складывается и передается по конвейеру.

Только последний звонок glNormal() будет иметь какой-либо эффект, потому что он перепишет любые другие glNormal() с последних glVertex().

Так что вам нужно чередовать свои glNormal() звонки:

glNormal3f(vn[(f[i].vn1-1)].x, vn[(f[i].vn1-1)].y, vn[(f[i].vn1-1)].z); 
glVertex3f(v[(f[i].v1-1)].x, v[(f[i].v1-1)].y, v[(f[i].v1-1)].z); 

glNormal3f(vn[(f[i].vn2-1)].x, vn[(f[i].vn2-1)].y, vn[(f[i].vn2-1)].z); 
glVertex3f(v[(f[i].v2-1)].x, v[(f[i].v2-1)].y, v[(f[i].v2-1)].z); 

glNormal3f(vn[(f[i].vn3-1)].x, vn[(f[i].vn3-1)].y, vn[(f[i].vn3-1)].z); 
glVertex3f(v[(f[i].v3-1)].x, v[(f[i].v3-1)].y, v[(f[i].v3-1)].z); 
+0

Это решает автомобиль и делает другие изображения лучше! однако чайник не фиксирован ...:/ – DWolf

+0

Я изменил нормали и переплел их, и все объекты выглядят идеально, за исключением чайника .. так что это ответ на мой вопрос. – DWolf

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