George Broughton
George Broughton

Reputation: 55

Simple Assimp Program Giving Incorrect Data

I'm trying to load a model from an obj file using Assimp but it gives incorrect data. I've tried a few different things but can't find the problem.

Vertex positions are off (slightly), but interestingly the face data is malformed. In my OBJ file (included) there are 20 faces. For this example my program is showing 20 faces but some of them only have 2 indices! This is with the triangulation flag on so I don't know if this is a bug in assimp or with my code. I have tried a few other flags as well but none seem to be working.

I've compacted the code which seems to be causing the issue below

test.cpp

#include <SDL2/SDL.h>
#include <GL/glew.h>
#include <SDL2/SDL_opengl.h>
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
#define GLM_FORCE_RADIANS
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <iostream>

using namespace std;

int main(int argc, char* args[])
{
    Assimp::Importer importer;

    const aiScene * scene = NULL;

    scene = importer.ReadFile("box.obj", aiProcess_JoinIdenticalVertices | aiProcess_Triangulate);

    if(!scene)
    {
        return -1;
    }

    for(GLuint i = 0; i < scene->mNumMeshes; i++)
    {
        const aiMesh* mesh = scene->mMeshes[i];

        //float* vertices = new float[mesh->mNumVertices * 3];
        //float* faces = new float[mesh->mNumFaces * 3];

        cout << "has positions: " << mesh->HasPositions() << " has faces: " << mesh->HasFaces() << endl;

        cout << "vertex count: " << mesh->mNumVertices << endl;
        cout << "face count: " << mesh->mNumFaces << endl;

        for(GLuint j = 0; j < mesh->mNumFaces; j++)
        {

            cout << "Face Indices: " << mesh->mFaces[j].mNumIndices << "    ";

            for(GLuint k = 0; k < mesh->mFaces[j].mNumIndices; k++)
            {
                cout << "I" << k << " V" << mesh->mFaces[j].mIndices[k] << " ";
            }

            cout << endl;

            //faces[j * 3] = mesh->mFaces[j].mIndices[0];
            //faces[j * 3 + 1] = mesh->mFaces[j].mIndices[1];
            //faces[j * 3 + 2] = mesh->mFaces[j].mIndices[2];
        }
    }

    return 0;
}

box.obj

v 0.000 0.000 1.000 
v 0.894 0.000 0.447 
v 0.276 0.851 0.447 
v -0.724 0.526 0.447 
v -0.724 -0.526 0.447 
v 0.276 -0.851 0.447 
v 0.724 0.526 -0.447 
v -0.276 0.851 -0.447 
v -0.894 0.000 -0.447 
v -0.276 -0.851 -0.447 
v 0.724 -0.526 -0.447 
v 0.000 0.000 -1.000

f 2 1 0 
f 3 2 0 
f 4 3 0 
f 5 4 0 
f 1 5 0 
f 11 6 7 
f 11 7 8 
f 11 8 9 
f 11 9 10 
f 11 10 6 
f 1 2 6 
f 2 3 7 
f 3 4 8 
f 4 5 9 
f 5 1 10 
f 2 7 6 
f 3 8 7 
f 4 9 8 
f 5 10 9 
f 1 6 10

output

has positions: 1 has faces: 1
vertex count: 11
face count: 20
Face Indices: 2    I0 V0 I1 V1 
Face Indices: 2    I0 V2 I1 V0 
Face Indices: 2    I0 V3 I1 V2 
Face Indices: 2    I0 V4 I1 V3 
Face Indices: 2    I0 V1 I1 V4 
Face Indices: 3    I0 V5 I1 V6 I2 V7 
Face Indices: 3    I0 V5 I1 V7 I2 V8 
Face Indices: 3    I0 V5 I1 V8 I2 V9 
Face Indices: 3    I0 V5 I1 V9 I2 V10 
Face Indices: 3    I0 V5 I1 V10 I2 V6 
Face Indices: 3    I0 V1 I1 V0 I2 V6 
Face Indices: 3    I0 V0 I1 V2 I2 V7 
Face Indices: 3    I0 V2 I1 V3 I2 V8 
Face Indices: 3    I0 V3 I1 V4 I2 V9 
Face Indices: 3    I0 V4 I1 V1 I2 V10 
Face Indices: 3    I0 V0 I1 V7 I2 V6 
Face Indices: 3    I0 V2 I1 V8 I2 V7 
Face Indices: 3    I0 V3 I1 V9 I2 V8 
Face Indices: 3    I0 V4 I1 V10 I2 V9 
Face Indices: 3    I0 V1 I1 V6 I2 V10

I am aware there are no deletes, etc I was just trying to strip out as much code as possible to make the problem easier to find.

For what its worth system = Ubuntu 15.04. Upgraded last night in the hope it might be a system problem

Upvotes: 0

Views: 822

Answers (1)

1201ProgramAlarm
1201ProgramAlarm

Reputation: 32727

It's because the vertex numbers in the faces should be 1-based, not 0-based.

Upvotes: 2

Related Questions