Визуальные артефакты при загрузке модели OBJ с помощью Assimp

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

паук

Ниже приведен соответствующий фрагмент кода:

//Storing the Indices
for (unsigned int t = 0; t < mesh->mNumFaces; ++t) {
    aiFace* face = &mesh->mFaces[t];
    memcpy(&faceArray[index], face->mIndices, 3*sizeof(unsigned int));
    index += 3;
}

//Storing the Vertices
for (unsigned int t = 0; t < mesh->mNumVertices; ++t) {
    aiVector3D vertex ;
    if (mesh->HasPositions()) {
        vertex = mesh->mVertices[t];
        memcpy(&vertexArray[index], &vertex,3*sizeof(float));
    }
    index += 3;          
}

//Render module
void model::helperDraw(GLuint vertexBufferID, GLuint indexBufferID, GLuint textureID)
{
    GLint indexSize;
    glBindBuffer(GL_ARRAY_BUFFER,vertexBufferID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexBufferID);
    glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &indexSize);
    glBindTexture( GL_TEXTURE_2D, textureID);
    glDrawElements(GL_TRIANGLES, indexSize/sizeof(GLuint), GL_UNSIGNED_INT, 0);
}

Что может быть не так с моим кодом?


person control    schedule 06.07.2014    source источник
comment
Вы уверены, что все ваши лица - треугольники? В обычном файле OBJ грани могут быть многоугольниками с любым количеством вершин.   -  person Reto Koradi    schedule 07.07.2014
comment
Да, действительно, как сказал @RetoKoradi, лица могут быть четырехъядерными или трехполосными. Передайте флаг aiProcess_Triangulate в assimp при загрузке модели, чтобы убедиться, что все грани триангулированы.   -  person glampert    schedule 07.07.2014
comment
Раньше флаг был aiProcessPreset_TargetRealtime_Quality, поменял на aiProcess_Triangulate и все заработало   -  person control    schedule 07.07.2014


Ответы (1)


В вашем коде нет ничего явно плохого. Одной из возможных причин этих артефактов рендеринга является то, что загружаемая вами модель OBJ имеет некоторые грани, которые являются треугольниками, а некоторые — нет. Вы визуализируете все как GL_TRIANGLES, но формат OBJ может определять грани как четырехугольники, треугольные полосы, треугольники и даже другие более экзотические вещи, такие как заплатки.

В Assimp есть средство триангуляции сетки, которое может значительно облегчить вашу жизнь при работе с этими многоформатными файлами сетки, такими как OBJ. Попробуйте передать флаг aiProcess_Triangulate методу загрузки импортеру или даже к методу постобработки, если вы выполняете постобработку как отдельный шаг. Вероятно, это решит проблему.

person glampert    schedule 07.07.2014
comment
Я пытаюсь использовать учебник [ogldev.atspace.co.uk/www /tutorial38/tutorial38.html] и добавить анимацию в мой код. Не мог понять, как найти 4 кости + веса, направляющие/относящиеся к определенной вершине в анимации. - person control; 31.07.2014
comment
@ppu, я думаю, уместно задать реальный вопрос на случай, если вам понадобится дополнительная помощь. Кроме того, вы можете посетить раздел GameDev: gamedev.stackexchange.com. - person glampert; 31.07.2014
comment
реальный вопрос [stackoverflow.com/questions/25063274/ - person control; 01.08.2014