所以我正在编写自己的代码来加载obj文件。 但我试图以这种格式划分一个字符串:(2例)
f 1/2/3 4/5/6 7/8/9
f 13/45/76 445/7776/5566 677/7/45
3组3个数字,除了斜线之间的每个地方后都有空格。截至目前,我有这段代码。
在节目的这一点上,它已经拉开了' f'关闭,但在字符串之前有一个空格,所以它像#34; 1/2/3 4/5/6 7/8/9"
第二组(" g2")是唯一不起作用的组。它正在回归," 1/2/3 7/8"
缓冲区是我划分的字符串。
// Divide into groups
// Create groups of 1/1/1, 2/2/1, 3/3/1 Ex
// At this point the buffer = SPACEHEREx/y/z u/v/w xn/yn/zn
string g1 = buffer.substr(1, buffer.find(' ', 1) - 1); // Pos 1 - First space
string g2 = buffer.substr(buffer.find(' ', 1) + 1, buffer.find(' ', buffer.find(' ', 1) + 1) - 1); // First space - Second space
string g3 = buffer.substr(buffer.find(' ', buffer.find(' ', 1) + 1) + 1, buffer.size()); // Second space - End
答案 0 :(得分:1)
我还没有对帖子发表评论,我很抱歉。
我肯定会建议将这些分成不同的行。 甚至采用buffer.find部件并将它们设置为适合位置名称。 调试稍微容易一些,也很容易阅读。
如果一些额外的int
太多,那么在调试完成后再合并它们。
你可以尝试的另一件事是在空格上分割缓冲线并保持“x / y / z”,调用“split by'/'”的函数然后将它们存储到适当的变量中。我认为.obj文件是“f vertex / texture / normal vertex / texture / normal ....”。
答案 1 :(得分:0)
这可能对您有所帮助:
http://www.rastertek.com/dx11tut08.html
它描述了如何加载和呈现.obj文件。
以下是如何从obj文件中读取行的片段(包括您尝试阅读的面(" f")):
// Initialize the indexes.
vertexIndex = 0;
texcoordIndex = 0;
normalIndex = 0;
faceIndex = 0;
// Open the file.
fin.open(filename);
// Check if it was successful in opening the file.
if(fin.fail() == true)
{
return false;
}
// Read in the vertices, texture coordinates, and normals into the data structures.
// Important: Also convert to left hand coordinate system since Maya uses right hand coordinate system.
fin.get(input);
while(!fin.eof())
{
if(input == 'v')
{
fin.get(input);
// Read in the vertices.
if(input == ' ')
{
fin >> vertices[vertexIndex].x >> vertices[vertexIndex].y >> vertices[vertexIndex].z;
// Invert the Z vertex to change to left hand system.
vertices[vertexIndex].z = vertices[vertexIndex].z * -1.0f;
vertexIndex++;
}
// Read in the texture uv coordinates.
if(input == 't')
{
fin >> texcoords[texcoordIndex].x >> texcoords[texcoordIndex].y;
// Invert the V texture coordinates to left hand system.
texcoords[texcoordIndex].y = 1.0f - texcoords[texcoordIndex].y;
texcoordIndex++;
}
// Read in the normals.
if(input == 'n')
{
fin >> normals[normalIndex].x >> normals[normalIndex].y >> normals[normalIndex].z;
// Invert the Z normal to change to left hand system.
normals[normalIndex].z = normals[normalIndex].z * -1.0f;
normalIndex++;
}
}
// Read in the faces.
if(input == 'f')
{
fin.get(input);
if(input == ' ')
{
// Read the face data in backwards to convert it to a left hand system from right hand system.
fin >> faces[faceIndex].vIndex3 >> input2 >> faces[faceIndex].tIndex3 >> input2 >> faces[faceIndex].nIndex3
>> faces[faceIndex].vIndex2 >> input2 >> faces[faceIndex].tIndex2 >> input2 >> faces[faceIndex].nIndex2
>> faces[faceIndex].vIndex1 >> input2 >> faces[faceIndex].tIndex1 >> input2 >> faces[faceIndex].nIndex1;
faceIndex++;
}
}
// Read in the remainder of the line.
while(input != '\n')
{
fin.get(input);
}
// Start reading the beginning of the next line.
fin.get(input);
}
// Close the file.
fin.close();
编辑:在这里的评论中解决问题是一个可能的解决方案:
std::string buffer = " 1/2/3 4/5/6 7/8/9";
string g1 = buffer.substr(1, buffer.find(' ', 1) - 1); // Pos 1 - First space
string g2 = buffer.substr(buffer.find(' ', 1) + 1, g1.length()); // First space - Second space
string g3 = buffer.substr(buffer.find(' ', buffer.find(' ', 1) + 1) + 1, g1.length()); // Second space - End
问题是substr()
的第二个参数。它应该是长度,而不是输入字符串中的位置。