我正在尝试编写一个非常简单的obj文件读取器,它将obj文件中的所有垂直值按顺序写入一个向量(已经完成了(,还将obj中的面值所引用的垂直值写入另一个向量,例如:
v1=0.0 0.0
v2=1.0 0.0 0.0
v3=1.0 1.0 0.0
f1=3 2 1
我的程序会在第一个向量中按顺序写入所有垂直值然后将在第二向量中如下所示地写入构成面的垂直值:1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0
一切都很好,直到我试图从第一个向量(verticalsCoordsXYZ(中获取值,并将它们推回到第二个向量(faceCoords(中。我注释掉的代码破坏了程序,看起来我在第一个向量中搜索的位置比向量大小大(当程序破坏时,我在内存位置错误时得到out_of_range,它说verticalsCoordsXYZ的大小是0(,尽管我用所有的vertical值填充了向量。
我做错了什么?我是不是不了解矢量是如何工作的,我是不是超出了矢量的范围?如何解决此问题?
string line;
while (getline(modelfile, line))
{
string s;
istringstream iss(line);
iss >> s;
vector <float> verticesCoordsXYZ;
vector <float> faceCoords;
if (s == "v")
{
float x, y ,z;
iss >> x >> y >> z;
verticesCoordsXYZ.push_back(x);
verticesCoordsXYZ.push_back(y);
verticesCoordsXYZ.push_back(z);
for (int i = 0; i < (int)verticesCoordsXYZ.size(); i++)
{
cout << verticesCoordsXYZ.at(i);
}
cout << endl;
}
if (s == "f")
{
int a, b, c;
iss >> a >> b >> c;
int aLocation = a * 3 - 3; //vertice locations in verticeCoordsXYZ that would make up faces
int bLocation = b * 3 - 3;
int cLocation = c * 3 - 3;
for (int i = 0; i < 2; i++)
{
//faceCoords.push_back(verticesCoordsXYZ.at(aLocation+i));
}
for (int i = 0; i < 2; i++)
{
//faceCoords.push_back(verticesCoordsXYZ.at(bLocation+i));
}
for (int i = 0; i < 2; i++)
{
//faceCoords.push_back(verticesCoordsXYZ.at(cLocation+i));
}
for (int i = 0; i < (int)faceCoords.size(); i++)
{
cout << faceCoords.at(i) << "f";
}
cout << endl << a << b << c;
}
}
modelfile.close();
每次通过while
循环都要重新创建向量,因为它们是在循环中声明的。这意味着当s == "f"
时,它们都是空的。
您应该在while
循环之外声明它们,在这里您声明line
。
您在while循环中声明向量,以便在每次while-go循环时重新设置种子。
尝试在while循环之前声明向量