gpt4 book ai didi

C++ OBJ文件解析器

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:50 27 4
gpt4 key购买 nike

我正在为 OBJ 文件制作一个文件解析器,一切都在正确的位置,但由于某种原因它不会运行到文件末尾。

    void loader::readIn()
{
//!takes in the all the data and
//!puts in string first.
std::string line;

while(!myFile.eof())
{

linetype = unknown;//enum set to uknown
line.clear(); // clear line
ss.clear(); // clear string stream
std::getline(myFile,line); //intake line , to string line

//found = line.find("v "); //enum to check the line type i,e Face ,vertex
if(line[0] == 'v') //! check to see if the first char is v
{
linetype = vertex;

}

// found = line.find("f ");
if(line[0] == 'f') //! checkl to see if the first char is f
{
linetype = face;

}

// found = line.find("vn ");
if(line[0] == 'vn') //! checkl to see if the first char is vn
{

linetype = vertexNormal;

}
// found = line.find("vt ")
if(line[0] == 'vt') //! checkl to see if the first char is vt
{
linetype = vertexTexture;

}

if(line[0] == ' ' || '#') // if the start of the line is empty or a #
{
line.clear(); //clear line
std::getline(myFile,line); // intake the next line
}



switch(linetype)
{
case vertex: //!stores the verrtex floats in vert.

ss >> vertexFloat[0] >> vertexFloat[1] >> vertexFloat[2];
verts.push_back(new coordinate(vertexFloat[0],vertexFloat[1],vertexFloat[2])); //creates new coord
linetype = unknown;
break;

case face:
int n; // these are the counters for the float arrays
int m;
int b;
n = 0;
m = 0;
b = 0;
int faces[3]; //temperary float array
int faceText[3];
int faceNorm[3];
ss.str(line); //string stream intake line
ss.ignore(1);
while( !ss.eof())
{

ss >> faces[n]; // intake first umber
n++;

if(ss.peek() == '/')
{
ss.ignore(1);

if(ss.peek() != '/')
{
ss >> faceText[m];
m++;
}
}

ss.ignore(1);
ss >> faceNorm[b];
b++;

}


for( int i = 0; i < 3 ; ++i)
{
totalFaces.push_back(faces[i]); // push back all the ints on the correct
faceTexture.push_back(faceText[i]); // vector
faceNormal.push_back(faceNorm[i]);
}
break;

这是它在前 3 行中使用的代码,然后就停止了。我正在检查包含每组 3 的第一个数字的 totalFaces vector 。

**f 1/2/3 4//6 7/8/9
f 1/2/3 4//6 7/8/9
f 1/2/3 4//6 7/8/9
f 1/2/3 4//6 7/8/9
f 1/2/3 4//6 7/8/9
f 1/2/3 4//6 7/8/9
f 1/2/3 4//6 7/8/9
f 1/2/3 4//6 7/8/9
f 1/2/3 4//6 7/8/9**

是我的obj文件。

最佳答案

您不必使用eof()。看我的代码:

void Mesh::LoadObjModel(const char *filename)
{
std::ifstream in(filename, std::ios::in);
if (!in)
{
std::cerr << "Cannot open " << filename << std::endl;
exit(1);

}
std::string line;
while (std::getline(in, line))
{
//check v for vertices
if (line.substr(0,2)=="v "){
std::istringstream v(line.substr(2));
glm::vec3 vert;
double x,y,z;
v>>x;v>>y;v>>z;
vert=glm::vec3(x,y,z);
vertices.push_back(vert);
}
//check for texture co-ordinate
else if(line.substr(0,2)=="vt"){

std::istringstream v(line.substr(3));
glm::vec2 tex;
int U,V;
v>>U;v>>V;
tex=glm::vec2(U,V);
texture.push_back(tex);

}
//check for faces
else if(line.substr(0,2)=="f "){
int a,b,c; //to store mesh index
int A,B,C; //to store texture index
//std::istringstream v;
//v.str(line.substr(2));
const char* chh=line.c_str();
sscanf (chh, "f %i/%i %i/%i %i/%i",&a,&A,&b,&B,&c,&C); //here it read the line start with f and store the corresponding values in the variables

//v>>a;v>>b;v>>c;
a--;b--;c--;
A--;B--;C--;
//std::cout<<a<<b<<c<<A<<B<<C;
faceIndex.push_back(a);textureIndex.push_back(A);
faceIndex.push_back(b);textureIndex.push_back(B);
faceIndex.push_back(c);textureIndex.push_back(C);
}

}
//the mesh data is finally calculated here
for(unsigned int i=0;i<faceIndex.size();i++)
{
glm::vec3 meshData;
glm::vec2 texData;
meshData=glm::vec3(vertices[faceIndex[i]].x,vertices[faceIndex[i]].y,vertices[faceIndex[i]].z);
texData=glm::vec2(texture[textureIndex[i]].x,texture[textureIndex[i]].y);
meshVertices.push_back(meshData);
texCoord.push_back(texData);
}

}

在上面的示例代码中,缺少表示正常的“Vn”。您可以添加另一个条件来检查与其他类似的“Vn”。我希望这可以解决你的问题。如果您需要完整的示例程序,请查看 here .

关于C++ OBJ文件解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21120699/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com