OpenGL——用多个纹理C++来构造.Objt对象

OpenGL——用多个纹理C++来构造.Objt对象,c++,opengl,C++,Opengl,我一直在四处阅读,试图了解如何使用.mtl文件将多个纹理应用于对象,我认为我找到了解决方案,并且有意义。我要做的是使用相同的网格将对象分割成不同的部分。所以整个对象都是一样的,只是我会把它分解成几个部分,这样我就可以在各个部分中循环,并使用不同的材质渲染它们 我面临的问题是如何确定何时使用新材料。我理解.obj文件格式 g front usemtl Frontal_Black f 300/213/214 299/214/215 301/215/214 f 301/215/214 302/216/

我一直在四处阅读,试图了解如何使用.mtl文件将多个纹理应用于对象,我认为我找到了解决方案,并且有意义。我要做的是使用相同的网格将对象分割成不同的部分。所以整个对象都是一样的,只是我会把它分解成几个部分,这样我就可以在各个部分中循环,并使用不同的材质渲染它们

我面临的问题是如何确定何时使用新材料。我理解.obj文件格式

g front
usemtl Frontal_Black
f 300/213/214 299/214/215 301/215/214
f 301/215/214 302/216/216 300/213/214
# 2 triangles in group

g tire_outSide
usemtl Tire
f 315/217/217 303/218/217 304/219/217
f 315/217/217 304/219/217 305/220/217
f 315/217/217 305/220/217 306/221/217
f 315/217/217 306/221/217 307/222/217
f 315/217/217 307/222/217 308/223/217
f 315/217/217 308/223/217 309/224/217
f 315/217/217 309/224/217 310/225/217
当新材料开始使用时,我正在努力掌握解析数据时如何进行的逻辑。我开始尝试创造一些新材料开始时可以识别的东西,但后来我绊倒了,认为它不起作用

while (!inFile.eof()) {
    string line;
    std::getline(inFile, line);

    if (line.substr(0, 2) == "v ") {//vertices
        std::vector<string> elements = Operations::split(Operations::trim(line.substr(3)), *" ");
        if (elements.size() > 1) {
            std::cout << "Loading vertex data: " << line << endl;
            Vertex * v = new Vertex(std::atof(elements.at(0).c_str()), std::atof(elements.at(1).c_str()), std::atof(elements.at(2).c_str()));
            indexedVertices.push_back(v);
        }
    }
    else if (line.substr(0, 2) == "vn") {//normals
        std::vector<string> elements = Operations::split(Operations::trim(line.substr(3)), *" ");
        std::cout << "Loading normal data: " << line << endl;
        if (elements.size() > 1) {
            Vector3 * v = new Vector3(std::atof(elements.at(0).c_str()), std::atof(elements.at(1).c_str()), std::atof(elements.at(2).c_str()));
            normals.push_back(v);
        }
    }
    else if (line.substr(0, 2) == "vt") {//tex coords
        std::cout << "Loading texture data: " << line << endl;
        std::vector<string> elements = Operations::split(Operations::trim(line.substr(3)), *" ");
        if (elements.size() > 1) {
            TextureCoordinate * t = new TextureCoordinate(std::atof(elements.at(0).c_str()), std::atof(elements.at(1).c_str()));
            textureCoords.push_back(t);
        }
    }

    else if (line.substr(0, 3) == "mtl") {
        MaterialParser * parser = new MaterialParser();
        materials = parser->parseMaterial("objects/" + line.substr(7));
        usingMaterial = true;
        delete parser;
    }
    else if (line.substr(0, 3) == "use") {
        currentObject = line.substr(7);//gets current material name
    }
    else if (line.substr(0, 2) == "f ") {//faces / indices
        if (currentObject != "" && usingMaterial) {
            //recognises new material starts, adds to new vector
        }

        std::cout << "Loading face data: " << line << endl;
        std::vector<string> elements = Operations::split(Operations::trim(line.substr(2)), *" ");
        if (elements.size() > 1) {
            for (int i = 0; i < elements.size(); i++) {
                std::vector<string> e = Operations::split(Operations::trim(elements.at(i)), *"/");
                if (e.size() > 1) {
                    verticesIndexed.push_back(std::atof(e.at(0).c_str()) - 1);
                    texturesIndexed.push_back(std::atof(e.at(1).c_str()) - 1);
                    normalsIndexed.push_back(std::atof(e.at(2).c_str()) - 1);
                }
            }
        }
    }
因此,我的文件的第一行是:

mtllib Material.mtl

我的代码可以很好地解析这个文件,存储所有必要的数据。然后我们来看看包含use的行,这意味着正在使用一个新的纹理,这就是问题所在


有人能帮我识别一个新的纹理已经开始,因此我需要开始将面添加到一个新的向量中吗?

你必须自己实现吗?有obj加载器可用,例如,在OpenSceneGraph中,请看是的,我必须自己做,我已经制作的.obj加载器工作正常。我只是在努力把它分成几个部分,这样我就可以用多种纹理对它进行纹理处理,因为目前它对整个东西进行纹理处理,而不使用提供的.mtl文件。我不明白你的问题。据我回忆,obj只允许每个面组使用一种材质,所以g或o,这与标记“后续顶点来自此命名组”相同。你可以在每次看到g时创建一个组。是的,这就是我想做的。我不知道如何使下面的面属于该组,尤其是当.obj文件中有多个组时。我正在努力将文件拆分为多个组,因为我不太理解每次找到g或usemtl时创建一个新组,然后允许以下面属于这个新创建的组的逻辑。