OpenGL - 使用多个纹理c ++对.obj对象进行纹理处理

时间:2015-04-19 07:20:55

标签: 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/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”的行,这意味着正在使用新的纹理,这就是问题所在。

有人可以帮助我了解我是如何识别新纹理已经开始的,因此我需要开始将面部添加到新的矢量中吗?

0 个答案:

没有答案