سؤال

So after reading this I thought it would be better to change to format i load my files in and decided to use .dae files. After writing this very simple xml-loader:

void Model::loadModelFromDae(std::string source)
{
    using namespace std;
    string name = source.substr(0,source.find("."));
    cout<<"+++LOADING::"<<name<<"+++"<<endl;

    ifstream file;
    file.open(source);
    string line;
    size =0;
    indexSize=0;

    while(getline(file,line))
    {
        /*possible float_array's: vertices and normal*/
        if(std::string::npos != line.find("<float_array"))
        {
            if(std::string::npos != line.find("positions"))
            {
                //get the size of the vertices float_array
                int loc_count = line.find("count");
                // to explain the hardcoded values: count=" is 7 char's
                string cout_substr = line.substr(line.find("count"),line.find(">"));
                cout_substr = cout_substr.substr(7,cout_substr.find("\"")); 
                size = atoi(cout_substr.c_str());
                cout<<"\tSIZE:"<<size<<endl;
                vertices = new float[size];
                memset(vertices,0.0f,sizeof(float)*size);

                string values = line.substr(line.find("count")+11,line.size());
                values = values.substr(0,values.size()-14);
                std::stringstream converter(values);
                vector<float> temp;
                // Iterate over the istream, using >> to grab floats
                // and push_back to store them in the vector
                std::copy(std::istream_iterator<float>(converter),
                    std::istream_iterator<float>(),
                    std::back_inserter(temp));
                for(int i=0;i<temp.size();i++) vertices[i] = temp.at(i);
            }
            //TODO: handle normal array
        }
        /*Handling indices*/
        if(std::string::npos != line.find("<p>"))
        {
            string values = line.substr(line.find(">")+1,line.length());
            values = values.substr(0,values.length()-4);
            std::stringstream converter(values);
            vector<short> temp;
            // Iterate over the istream, using >> to grab shorts
            // and push_back to store them in the vector
            std::copy(std::istream_iterator<short>(converter),
                std::istream_iterator<short>(),
                std::back_inserter(temp));
            indices = new short[temp.size()];
            indexSize = temp.size();
            cout<<"\tINDEXSIZE:"<<indexSize<<endl;
            for(int i=0;i<temp.size();i++) indices[i] = temp.at(i);
        }
    }

    cout<<"+++ENDED LOADING +DAE+ FILE:"<<name<<"+++"<<endl;
}

I still have a few problems: I'm trying to load a cube, and checked each vertex/index and they exactly match the XML-file but the output is not at all what i expect: the cube renders the triangles, but not in the order they should be. So I got a few questions:

  • Does .dae save it's indices in a different format then openGL takes it?
  • (Optional because it requires a lot of debugging) Can you spot my mistake, my initial thought was that the facing of the vertices is wrong but putting glFrontFace(GL_CCW); or glFrontFace(GL_CW); doesn't change anything.
هل كانت مفيدة؟

المحلول

After messing around with the indices, I came to this conclusion: the indices are not only the indices of the vertices, but also of the normals and the UV's. So, when loading the indices you should be carefull which index belongs to which element.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top