Проблема в реализации парсера .obj файлов в Qt
Пробую написать парсер для .obj файлов в Qt. Пока пытаюсь взять из файла координаты и вывести их в Qt. Вроде бы все хорошо, но нужно заменить точку на запятую, пишу подобный код, но в итоге числа просто выводятся целые.
Также при проверке увидел, что первые три числа в неправильном формате, и числа не те при проверке, как в файле.
Как это дело можно исправить?
PS Делаю по видео: https://www.youtube.com/watch?v=_QOY3LRpK8U
Пример кода:
v -61.702400 -10.384300 19.096399
v -61.688599 -10.584200 19.090099
v -61.706699 -10.392700 19.297800
v 63.285301 9.466500 -24.145901
v 63.330898 9.278900 -24.356501
v 63.286201 9.474400 -24.347000
v -60.736301 -7.307700 11.027200
v -60.924599 -7.338100 11.127200
v -60.976101 -6.943100 11.180100
v -61.700500 -10.795700 19.287701
v -60.253300 -30.198000 24.508400
v -60.469601 -30.213600 24.128901
v -60.358601 -30.407301 24.313601
v 63.207500 8.932300 -10.668100
v 63.238400 8.727000 -10.475100
for(int j=0; j<10; j++, i++){ //Координата x
if (line.at(i)=='.'){ //Замена точек на запятую в координатах
crd[j]=',';
continue;
}
Полный код, файл obj.loader.h:
#ifndef OBJ_LOADER_H
#define OBJ_LOADER_H
#include <QWidget>
#include <QtOpenGL>
#include<vector>
#include<string>
#include<stdlib.h>
class obj_loader : public QWidget
{
Q_OBJECT
public:
obj_loader(QWidget *parent = nullptr);
~obj_loader();
private:
std::string fdata;
void init_fdata();
void init_vertex();
void parse_line(const std::string&);
void chk_vertex_vec();
struct coord{
float x,y,z;
};
std::vector<coord> vertex_vec;
protected:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
};
#endif // OBJ_LOADER_H
Файл obj_loader.cpp
#include "obj_loader.h"
#include<fstream>
#include<QDebug>
#include <QtOpenGL>
#include<stdlib.h>
obj_loader::obj_loader(QWidget *parent)
: QWidget(parent)
{
init_fdata();
}
obj_loader::~obj_loader()
{
}
void obj_loader::initializeGL()
{
glClearColor(0,0,0,0);
glEnable(GL_DEPTH_TEST);
}
void obj_loader::resizeGL(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0,0,w,h);
glOrtho(-5,5,-5,5,-5,5);
}
void obj_loader::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void obj_loader::init_fdata()
{
std::ifstream ifile("C:/Users/user/obj_loader/compressor.obj");
while (ifile.good()){
fdata.push_back(ifile.get());
}
ifile.close();
init_vertex();
chk_vertex_vec();
}
void obj_loader::init_vertex()
{
std::string line;
for (int i=0;i<fdata.size();i++)
{
line.push_back(fdata.at(i));
if (fdata.at(i)=='\n') {
//qDebug()<<QString::fromStdString(line);
parse_line(line);
line.clear();
}
}
}
void obj_loader::parse_line(const std::string &line){
coord curr_c;
for (int i=0;i<line.size();i++){
if (line.at(0)=='v' && line.at(1)==' '){
i+=2;
char crd[10];
for (int _i=0; _i<10; _i++)
crd[_i]=0;
for(int j=0; j<10; j++, i++){ //Координата x
if (line.at(i)=='.'){ //Замена точек на запятую в координатах
crd[j]=',';
continue;
}
crd[j]=line.at(i);
if (line.at(i)==' '){
i++;
curr_c.x = atof(crd);
for (int _i=0; _i<10; _i++)
crd[_i]=0;
break;
}
}
for(int j=0; j<10;j++, i++){ //Координата y
if (line.at(i)=='.'){ //Замена точек на запятую в координатах
crd[j]=',';
continue;
}
crd[j]=line.at(i);
if (line.at(i)==' '){
i++;
curr_c.y = atof(crd);
for (int _i=0; _i<10; _i++)
crd[_i]=0 ;
break;
}
}
for(int j=0; j<10;j++, i++){ //Координата z
if (line.at(i)=='.'){ //Замена точек на запятую в координатах
crd[j]=',';
continue;
}
crd[j]=line.at(i);
if (line.at(i)==' '||line.at(i)=='\n'){
curr_c.z = atof(crd);
break;
}
}
vertex_vec.push_back(curr_c);
return;
}
}
}
void obj_loader::chk_vertex_vec(){
for (int i=0; i<vertex_vec.size(); i++){
qDebug()<<"X="<<vertex_vec.at(i).x<<" Y="<<vertex_vec.at(i).y<<" Z="<<vertex_vec.at(i).z<<'\n';
}
}