OpenGL——用多个纹理C++来构造.Objt对象
我一直在四处阅读,试图了解如何使用.mtl文件将多个纹理应用于对象,我认为我找到了解决方案,并且有意义。我要做的是使用相同的网格将对象分割成不同的部分。所以整个对象都是一样的,只是我会把它分解成几个部分,这样我就可以在各个部分中循环,并使用不同的材质渲染它们 我面临的问题是如何确定何时使用新材料。我理解.obj文件格式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/
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时创建一个新组,然后允许以下面属于这个新创建的组的逻辑。