简体   繁体   中英

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

这是因为面中的顶点数应基于1,而不是基于0。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM