Читайте в пунктах из файла OBJ C++

Я пытаюсь прочитать в следующем файле 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 
.
.
.

Я пытаюсь настроить функцию, которая будет хранить значения вершины (3 значения после char v) для вектора точек (Pt состоит из a x, y и z) и значений грани (3 значения, следующие за символом f) для другого вектора граней (грань состоит из 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;
    }
}

Всякий раз, когда я тестирую этот метод, отображая значение x в первом операторе if, я получаю значение "-858993460". Как я могу исправить эту функцию? Размещение линии игры показано закомментированным.

1 ответ

Вместо того, чтобы писать свой собственный читатель файла obj, вы можете, например, использовать assimp ( http://www.assimp.org/)

относительно вашего кода: вы должны проверить, является ли строка пустой, прежде чем получить доступ к строке с индексом 0. Затем, при чтении значений с плавающей запятой, вы должны сначала пропустить символ из строки ("v" в случае вершины). Например, вы можете просто прочитать его в фиктивную переменную char. И, наконец, >> меняет состояние входного потока. Например, вы можете использовать поток строк и инициализировать его текущей строкой, а затем читать из этого потока.

Что-то вроде этого:

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";
}
Другие вопросы по тегам