2

我正在尝试加载 obj 模型:

# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
# File Created: 05.11.2012 20:07:48

mtllib test.mtl

#
# object Box001
#

v  -12.6264 0.0000 -58.6877
v  -12.6264 0.0000 6.8357
v  43.9557 0.0000 6.8357
v  43.9557 0.0000 -58.6877
v  43.9557 -51.9219 6.8357
v  -12.6264 -51.9219 6.8357
v  -12.6264 -51.9219 -58.6877
v  43.9557 -51.9219 -58.6877
# 8 vertices

vn 0.0000 1.0000 -0.0000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 0.0000 -0.0000
vn 0.0000 0.0000 -1.0000
vn -1.0000 0.0000 -0.0000
# 6 vertex normals

vt 0.0000 65.5234 0.0000
vt 0.0000 0.0000 0.0000
vt 56.5821 0.0000 0.0000
vt 56.5821 65.5234 0.0000
vt 0.0000 -51.9219 0.0000
vt 56.5821 -51.9219 0.0000
vt 65.5234 0.0000 0.0000
vt 65.5234 -51.9219 0.0000
# 8 texture coords

g Box001
usemtl wire_229154215
s 2
f 1/1/1 2/2/1 3/3/1 4/4/1 
s 4
f 5/2/2 6/3/2 7/4/2 8/1/2 
s 8
f 3/3/3 2/2/3 6/5/3 5/6/3 
s 16
f 4/7/4 3/2/4 5/5/4 8/8/4 
s 32
f 1/3/5 4/2/5 8/5/5 7/6/5 
s 64
f 2/7/6 1/2/6 7/5/6 6/8/6 
# 6 polygons

我有一个名为 Model 的课程:

#ifndef _Model_H_
#define _Model_H_

#include <vector>

struct Coordinate{
    float X,Y,Z;
    Coordinate(float x,float y,float z);
};

struct TextureCoordinate{
    float U,V;
    TextureCoordinate(float u,float v);
};

struct Face
{
    int VertexIndex,TextureIndex,NormalIndex;

    Face(int vi, int ti, int ni);

};

class Model
{
public:
    Model(void);
    ~Model(void);
    bool IsTriangle;
    std::string Name;
    std::vector<Coordinate> Vertices;
    std::vector<Coordinate> VerticesNormals;
    std::vector<Coordinate> VerticesTexture;
    std::vector<Face      > Faces;
    int ModelNumber;
};

#endif

并尝试像这样加载它:-

Model ModelsLoader::LoadModel(const char * ModelName){
    std::ifstream fs(ModelName);
    char temp[256];
    std::string * line;
    Model m;
    float tempX,tempY,tempZ;
    int tempA1,tempA2,tempA3,tempA4;

    if(fs.is_open()){

        while (!fs.eof())
        {
            fs.getline(temp,256);
            Lines.push_back(new std::string(temp));
        }
        int c,slashes;
        for (int i = 0; i < Lines.size(); i++)
        {
            line = Lines[i];

            if(line->size() == 0 ||(*line)[0] == '#' ) continue;
            else if((*line)[0] == 'v' && (*line)[1] == ' ')
            {
                sscanf(line->c_str(),"v %f %f %f",&tempX,&tempY,&tempZ); 
                m.Vertices.push_back( Coordinate(tempX,tempY,tempZ));
            }
            else if((*line)[0] == 'v' && (*line)[1] == 't'){
                sscanf(line->c_str(),"vn %f %f %f",&tempX,&tempY,&tempZ); 
                m.VerticesTexture.push_back( Coordinate(tempX,tempY,tempZ));
            }
            else if((*line)[0] == 'v' && (*line)[1] == 'n'){
                sscanf(line->c_str(),"vn %f %f %f",&tempX,&tempY,&tempZ); 
                m.VerticesNormals.push_back( Coordinate(tempX,tempY,tempZ));
            }
            else if((*line)[0] == 'f' && (*line)[1] == ' ')
            {
                c = std::count(line->begin(),line->end(),' ') - 1;
                slashes = std::count(line->begin(),line->end(),'/');

                if( slashes / c == 2){
                    int i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12;
                    sscanf(line->c_str(),"f %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d",&i1,&i2,&i3,&i4,&i5,&i6,&i7,&i8,&i9,&i10,&i11,&i12);
                    m.Faces.push_back(Face(i1-1,i2-1,i3-1));
                    m.Faces.push_back(Face(i4-1,i5-1,i6-1));
                    m.Faces.push_back(Face(i7-1,i8-1,i9-1));
                    m.Faces.push_back(Face(i10-1,i11-1,i12-1));
                    m.IsTriangle = false;
                }
                else if (slashes / c == 3)
                {
                    int i1,i2,i3,i4,i5,i6,i7,i8,i9;
                    sscanf(line->c_str(),"f %d/%d/%d %d/%d/%d %d/%d/%d",&i1,&i2,&i3,&i4,&i5,&i6,&i7,&i8,&i9);
                    m.Faces.push_back(Face(i1-1,i2-1,i3-1));
                    m.Faces.push_back(Face(i4-1,i5-1,i6-1));
                    m.Faces.push_back(Face(i7-1,i8-1,i9-1));
                    m.IsTriangle = true;
                }

            }
        }
        fs.close();
        m.ModelNumber = glGenLists(1);
        glNewList(m.ModelNumber, GL_COMPILE);
        for (int i = 0; i < m.Faces.size(); i++)
        {
            if(m.IsTriangle){
            }
            else
            {
                glBegin(GL_QUADS);
                for (int i = 0; i < m.Faces.size(); i++)
                {
                    glVertex3f(m.VerticesNormals[m.Faces[i].NormalIndex].X,m.VerticesNormals[m.Faces[i].NormalIndex].Y,m.VerticesNormals[m.Faces[i].NormalIndex].Z);
                    glNormal3f(m.Vertices[m.Faces[i].VertexIndex].X,m.Vertices[m.Faces[i].VertexIndex].Y,m.Vertices[m.Faces[i].VertexIndex].Z);
                }
                glEnd();
            }
        }
        glEndList();
    }

    Clear();
    return m;
}

现在,当我调用列表时,它没有显示任何内容:-

void drawScene() {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
    glLoadIdentity(); //Reset the drawing perspective

    camera();

    glCallList(model.ModelNumber);

    glutSwapBuffers(); //Send the 3D scene to the screen
}

在这里做什么?

4

1 回答 1

0

确保ModelsLoader::LoadModel() 通过glutCreateWindow().

如果您在拥有当前 GL 上下文LoadModel() 之前调用,则其中的所有 GL 调用都将失败。

于 2012-11-05T23:45:47.220 回答