Форма модели отличается после загрузки ее в проект

У меня есть Barrack.obj объект с файлом Barrack.mtl. Также есть несколько файлов .tga. Я хочу загрузить этот объект в проект opengl. Для этого я .mtl файлы .obj и .mtl. А затем нарисуйте модель и установите такие материалы (метод draw в объекте модели)

for(int g = 0; g < faces.size(); g++)
{
 glMaterialfv(GL_FRONT, GL_SPECULAR, materials[g].Ks);
 glMaterialfv(GL_FRONT, GL_DIFFUSE, materials[g].Kd);
 glMaterialfv(GL_FRONT, GL_AMBIENT, materials[g].Ka);
 glMaterialf(GL_FRONT, GL_SHININESS, materials[g].Ns);

 glBegin(GL_TRIANGLES);

 for(int f = 0; f < faces[g].size(); f++)
 {
 glNormal3f(normals[faces[g][f].vn1 - 1].x, normals[faces[g][f].vn1 - 1].y, normals[faces[g][f].vn1 - 1].z);
 glVertex3f(vertices[faces[g][f].v1 - 1].x, vertices[faces[g][f].v1 - 1].y, vertices[faces[g][f].v1 - 1].z);

 glNormal3f(normals[faces[g][f].vn2 - 1].x, normals[faces[g][f].vn2 - 1].y, normals[faces[g][f].vn2 - 1].z);
 glVertex3f(vertices[faces[g][f].v2 - 1].x, vertices[faces[g][f].v2 - 1].y, vertices[faces[g][f].v2 - 1].z);

 glNormal3f(normals[faces[g][f].vn3 - 1].x, normals[faces[g][f].vn3 - 1].y, normals[faces[g][f].vn3 - 1].z);
 glVertex3f(vertices[faces[g][f].v3 - 1].x, vertices[faces[g][f].v3 - 1].y, vertices[faces[g][f].v3 - 1].z);
 }

 glEnd();
}

normals, materials и т.д. представляют собой массивы с данными из .mtl и .obj. ks, kd, ka, ns те же значения из файла .mtl. В отладчике кажется, что все массивы (векторы) с данными из файлов заполнены правильно. Но у объекта есть несколько задушенных peaks на крыше.

Я инициализирую glut

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(screenWidth, screenHeight);
glutCreateWindow("LOADER");
reshape(screenWidth, screenHeight);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);

glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); 
glEnable(GL_DEPTH_TEST);

GLfloat light_ambient[] = { 0.5, 0.5, 0.5, 1.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);

if(!model.load("Barrack.obj"))
{
 cout << "Could not load model" << endl;
 return false;
}

glutDisplayFunc(draw);

Где функция draw

void draw()
{
glPushMatrix();

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

glCallList(g_persp);

gluLookAt( 0, 3, 3, // eye pos
 0, 0, 0, // aim point
 0, 1, 0); // up direction

glRotatef(angle, 0.0, 1.0, 0.0);
glColor4f(1.0, 1.0, 1.0, 1.0);
glScalef(0.1, 0.1, 0.1);
model.draw(); // method draw mentioned earlier

glCallList(g_ortho);

glPopMatrix();

glutSwapBuffers();
}

В чем проблема?Почему на крыше есть пики? В модели assimpviewer выглядит так

Функция изменения

void reshape(int w, int h)
{
if(h == 0) 
{
 h = 1;
}

screenWidth = w;
screenHeight = h;

glDeleteLists(g_persp, 1);
glDeleteLists(g_ortho, 1);

glViewport(0, 0, w, h);

g_persp = glGenLists(1);
g_ortho = glGenLists(1);

glNewList(g_persp, GL_COMPILE);

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();

 gluPerspective(45, (float)w / h, 0.1, 100);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();

glEndList();

glNewList(g_ortho, GL_COMPILE);

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();

 glOrtho(0, w, h, 0, -100, 100);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();

glEndList();
}
1 ответ

Это, вероятно, только строительные полигоны, используемые для некоторых расчетов дизайнером модели. Скорее всего, они отмечены невидимыми в файле obj, и вам просто нужно отфильтровать их при загрузке модели, если у вас есть доступ к коду загрузки.

licensed under cc by-sa 3.0 with attribution.