#ifndef OBJ_H
#define OBJ_H
#include
#include
class obj
{
public:
struct Vertex
{
float x, y, z;
};
struct Face
{
int f1, f2, f3, f4;
};
void input(char *);
friend std::ostream & operator<<(std::ostream & os,const obj & ob);
obj();
~obj();
typedef std::vector Ve;
typedef std::vector Fa;
private:
Ve ve;
Fa fa;
};
#endif // !OBJ_VIEW_CLASS_H
#include"obj.h"
#include
#include
#include
obj::obj()
{}
obj::~obj()
{}
void obj::input(char * FileName)
{
std::ifstream in(FileName);
if (!in) return;
std::string s;
while (in >> s)
{
switch (*s.c_str())
{
case 'v':
{
Vertex v;
in >> v.x >> v.y >> v.z;
ve.push_back(v);
}
case 'f':
{
Face f;
in >> f.f1 >> f.f2 >> f.f3 >> f.f4;
fa.push_back(f);
}
}
}
}
std::ostream & operator<<(std::ostream & os,const obj & ob)
{
for (unsigned int i = 0; i < ob.ve.size(); i++) os << ob.ve[i].x << ob.ve[i].y << ob.ve[i].z;
for (unsigned int i = 0; i < ob.fa.size(); i++) os << ob.fa[i].f1 << ob.fa[i].f2 << ob.fa[i].f3 << ob.fa[i].f4;
return os;
}
int main()
{
obj ob;
ob.input("basic model.obj");
std::cout << ob;
getchar();
return 0;
}
最后的输出是-1.07374e+08-1.07374e+08-1.07374e+08-858993460-858993460-858993460-858993460
读取的地方有问题,我这里换成了一行行读取,然后sscanf格式化提取
#include"obj.h"
#include<fstream>
#include<string>
#include<iostream>
obj::obj()
{}
obj::~obj()
{}
void obj::input(char * FileName)
{
std::ifstream in(FileName);
if (!in) return;
char buff[1024] = {0};
while (in.getline(buff, 1024))
{
switch (buff[0])
{
case 'v':
{
Vertex v;
sscanf(buff, "v %f %f %f", &v.x, &v.y, &v.z);
//in >> v.x >> v.y >> v.z;
ve.push_back(v);
break;
}
case 'f':
{
Face f;
sscanf(buff, "f %d %d %d %d", &f.f1, &f.f2, &f.f3, &f.f4);
//in >> f.f1 >> f.f2 >> f.f3 >> f.f4;
fa.push_back(f);
break;
}
}
}
}
std::ostream & operator<<(std::ostream & os,const obj & ob)
{
for (unsigned int i = 0; i < ob.ve.size(); i++) os << ob.ve[i].x << " " << ob.ve[i].y << " " <<ob.ve[i].z << std::endl;
for (unsigned int i = 0; i < ob.fa.size(); i++) os << ob.fa[i].f1 << " " <<ob.fa[i].f2 << " " <<ob.fa[i].f3 << " " <<ob.fa[i].f4 << std::endl;
return os;
}
int main()
{
obj ob;
ob.input("basic model.obj");
std::cout << ob;
getchar();
return 0;
}
basic model.obj文件的部分内容是:
mtllib 人体基本模型.mtl
#
#
v 8.206177 149.575684 7.019145
v 13.651268 155.530914 -1.473303
v 17.910635 167.460831 -15.258268
v 17.261469 137.524384 9.521211
v 21.630640 164.190140 -17.363892
v 17.344156 146.340393 -0.580418
v 53.766506 105.189636 5.919157
v 52.537846 98.139229 -17.698259
v 45.180187 96.170189 -34.722229
v 32.851185 54.406116 -25.581568
v 39.707863 60.869682 -10.158324
v 38.343487 62.783382 15.084597
v 27.307192 69.703369 32.602215
v 46.473713 151.184769 -26.991053
v 49.092541 145.877335 -8.915635
v 55.945309 125.678093 2.675766
v 61.115013 107.912086 -10.903605
v 59.585373 106.927902 -25.550871
v 51.888321 113.080612 -36.462933
g ____________013
usemtl _____________default
f 2794 1 2791 2795
f 2795 2791 697 2792
f 701 2793 2795 2792
f 2793 700 2794 2795
f 2792 697 2796 2799
f 2799 2796 322 2797
f 2798 2799 2797 698
f 701 2792 2799 2798
f 2802 701 2798 2803
f 2803 2798 698 2800
f 2801 2803 2800 325
f 2801 699 2802 2803
f 2806 2805 700 2793
f 2802 2806 2793 701
f 699 2804 2806 2802
f 2804 4 2805 2806
f 2810 2 2807 2811
f 2133 8407 8423 8425
f 8423 8422 8425
f 8425 8424 8430 8426
f 2133 8425 8426 8408
f 8369 8408 8426 8370
f 8426 2139 8427 8434
f 8427 8435 8434