Читайте в пунктах из файла 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";
}