从OBJ文件中读取点

Read In Points From OBJ File C++

本文关键字:读取 文件 OBJ      更新时间:2023-10-16

我正在尝试读取以下OBJ文件

#--- ObjWriter ---
v -0.599972 -0.599972 -0.599972
v -0.304591 -0.834531 0.539150
.
.
.
f 1 2 6 
f 1 6 5 
f 1 5 7 
.
.
.

我正试图建立一个函数,该函数将顶点的值(char v之后的3个值)存储到点的向量(Pt由x, y和z组成)和一个面的值(char f之后的3个值)存储到另一个面向量(face由3个整数组成)。到目前为止,我已经尝试了以下函数:

void readFile(char *inFile)
{
    ifstream inF(inFile);
    string line;
    while (getline(inF, line))
    {
        if (line[0] == 'v')
        {
            float x, y, z;
            inF >> x >> y >> z;
            // cout << x;
            verts.push_back(Pt(x, y, z));
        }
        else if (line[0] == 'f')
        {
            int x, y, z;
            inF >> x >> y >> z;
            faces.push_back(Face(x, y, z));
        }
        else if (line[0] == '#')
            continue;
    }
}

每当我通过在第一个if语句中显示x值来测试此方法时,我都会得到值"-858993460"。如何修复这个函数?cout行的位置被注释掉了。

您可以使用assimp (http://www.assimp.org)代替编写您自己的obj文件读取器

关于代码:在访问索引0处的字符串之前,应该检查line是否为空。然后,在读取浮点值时,必须首先从行中跳过char(在顶点的情况下为"v")。例如,你可以把它读入一个虚拟字符变量。最后,>>改变输入流的状态。例如,您可以使用stringstream并将其初始化为当前行,然后从该流中读取。

像这样:

if(line.empty())
    continue;
if (line[0] == 'v')
{
    float x, y, z;
    char dummy;
    std::stringstream ss(line);
    ss >> dummy >> x >> y >> z;
    cout << x << ";" << y << ";" << z << "n";
}