Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenGL] Loader OBJ - vector subscript out of range

Ostatnio zmodyfikowano 2015-01-17 21:20
Autor Wiadomość
kaziupir
Temat założony przez niniejszego użytkownika
[OpenGL] Loader OBJ - vector subscript out of range
» 2015-01-17 20:29:17
Witam.

Robię grę w opengl i posiadam taki prosty loader Obj:
 
C/C++
struct SFace {
    int v[ 3 ];
    int n[ 3 ];
    int t[ 3 ];
};
struct vec3 {
    float x, y, z;
};

GLuint LoadObj( char * file ) {
   
    FILE * fp = fopen( file, "r" );
   
    if( fp == NULL ) {
        printf( "ERROR: Cannot read model file \"%s\".\n", file );
        return - 1;
    }
   
    std::vector < vec3 > * v = new std::vector < vec3 >();
    std::vector < vec3 > * n = new std::vector < vec3 >();
    std::vector < vec3 > * t = new std::vector < vec3 >();
    std::vector < SFace > * f = new std::vector < SFace >();
   
    char buf[ 128 ];
   
    while( fgets( buf, 128, fp ) != NULL ) {
        if( buf[ 0 ] == 'v' && buf[ 1 ] == ' ' ) {
            vec3 * vertex = new vec3();
            sscanf( buf, "v %f %f %f", & vertex->x, & vertex->y, & vertex->z );
            v->push_back( * vertex );
        }
        if( buf[ 0 ] == 'v' && buf[ 1 ] == 't' ) {
            vec3 * vertex = new vec3();
            sscanf( buf, "vt %f %f", & vertex->x, & vertex->y );
            t->push_back( * vertex );
        }
        if( buf[ 0 ] == 'v' && buf[ 1 ] == 'n' ) {
            vec3 * vertex = new vec3();
            sscanf( buf, "vn %f %f %f", & vertex->x, & vertex->y, & vertex->z );
            n->push_back( * vertex );
        }
        if( buf[ 0 ] == 'f' && buf[ 1 ] == ' ' ) {
            SFace * face = new SFace();
            sscanf( buf, "f %d/%d/%d %d/%d/%d %d/%d/%d",
            & face->v[ 0 ], & face->t[ 0 ], & face->n[ 0 ],
            & face->v[ 1 ], & face->t[ 1 ], & face->n[ 1 ],
            & face->v[ 2 ], & face->t[ 2 ], & face->n[ 2 ]
            );
            f->push_back( * face );
        }
    }
   
    fclose( fp );
   
    GLuint dlId;
    dlId = glGenLists( 1 );
    glNewList( dlId, GL_COMPILE );
    glBegin( GL_TRIANGLES );
    for( int i = 0; i < f->size(); ++i ) {
        for( int j = 0; j < 3; ++j ) {
            vec3 * cv = &( * v )[(( * f )[ i ].v[ j ] - 1 ) ];
            vec3 * ct = &( * t )[(( * f )[ i ].t[ j ] - 1 ) ];
            vec3 * cn = &( * n )[(( * f )[ i ].n[ j ] - 1 ) ];
            glTexCoord2f( ct->x, ct->y );
            glNormal3f( cn->x, cn->y, cn->z );
            glVertex3f( cv->x, cv->y, cv->z );
        }
    }
    glEnd();
    glEndList();
   
    delete v;
    delete n;
    delete t;
    delete f;
   
    return dlId;
}
Po odpaleniu dostaję błąd "vector subscript out of range". Ale nie zawsze. Niektóre modele ładuje dobrze, a niektóre nie odpalają. Co może być nie tak?[/i]
P-125111
kaziupir
Temat założony przez niniejszego użytkownika
Rozwiązane
» 2015-01-17 21:20:33
Udało mi się rozwiązać problem. Może ktoś będzie mieć podobny problem, więc napiszę co było nie tak.
 Przed zapisaniem modelu trzeba było usunąć kamerę i lampę, żeby został sam model. Robiłem w blenderze.
P-125119
« 1 »
  Strona 1 z 1