1.obj文件的读取
#include<sstream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#include <iostream>
#include <fstream>
#include <GL/GLAUX.H>
#pragma comment(lib, "glew32.lib")
#pragma comment(lib,"glaux.lib ")
using namespace std;
float eye[3] = {0,0,0};
float degreex=0;
float degreey=0;
float degreez=0;
string s1;
GLfloat f2,f3,f4;
int v_num=0; //记录点的数量
int vn_num=0;//记录法线的数量
int f_num=0; //记录面的数量
GLfloat **vArr; //存放点的二维数组
GLfloat **vnArr;//存放法线的二维数组
int **fvArr; //存放面顶点的二维数组
int **fnArr; //存放面法线的二维数组
//int v_num=382;
//int vn_num=382;
//int f_num=760;
//GLfloat vArr[382][3];
//GLfloat vnArr[382][3];
//
//int fvArr[760][3];
//int fnArr[760][3];
int counta(string addr)//计数函数
{
ifstream filea(addr.c_str());
cout << "读取文件"<<endl;
if (!filea)
{
cout << "读取文件失败";
return -1;
}
string strline;
while(getline(filea,strline))
{
if(strline[0]=='v')
{
if(strline[1]=='n')//vn得到法线的数目
{vn_num++;
}
if(strline[1]==' ')//v得到顶点的数目
{v_num++;
}
}
if (strline[0]=='f') //得到面的数目
{f_num++;
}
}
//cout<<v_num<<endl<<vn_num<<endl<<f_num<<endl;
int i=0;
vArr=new GLfloat*[v_num];//开辟存放顶点的空间
for (int i=0;i<v_num;i++)
{
vArr[i]=new GLfloat[3];
}
vnArr=new GLfloat*[vn_num];//开辟存放法线的空间
for (i=0;i<vn_num;i++)
{
vnArr[i]=new GLfloat[3];
}
fvArr=new int*[f_num];//面
fnArr=new int*[f_num];
for (i=0;i<f_num;i++)
{
fvArr[i]=new int[3];
fnArr[i]=new int[3];
}
return 0;
}
int reada(string addr) //读取文件内容并存储各个数组
{
ifstream filea(addr.c_str());
cout << "load……"<<endl;
if (!filea)
{
cout << "读取文件失败";
return -1;
}
string strline;
int ii=0,jj=0,kk=0;
while(getline(filea,strline))
{
if(strline[0]=='v')
{
if(strline[1]=='n')//vn
{
istringstream strin(strline);
strin>>s1>>f2>>f3>>f4;
vnArr[ii][0]=f2;
vnArr[ii][1]=f3;
vnArr[ii][2]=f4;
ii++;
}
if(strline[1]==' ')//v
{
istringstream strin(strline);
strin>>s1>>f2>>f3>>f4;
vArr[jj][0]=f2;
vArr[jj][1]=f3;
vArr[jj][2]=f4;
jj++;
//cout<<"good";
}
}
if (strline[0]=='f') //读取面
{
istringstream in(strline);
GLfloat a;
in>>s1;//去掉前缀f
int i,k;
for(i=0;i<3;i++)
{
in>>s1;
// cout<<s1<<endl;
//取得顶点索引和法线索引
a=0;
for(k=0;s1[k]!='/';k++)
{
//cout<<s1[k]<<endl;
a=a*10+(s1[k]-48);
// cout<<a<<endl;
}
fvArr[kk][i]=a;
k++;
for(;s1[k]!='/';k++)
{;
}
a=0;
for(k=k+1;s1[k];k++)
{
a=a*10+(s1[k]-48);
}
fnArr[kk][i]=a;
}
kk++;
}
}
filea.close();
return 0;
}
到这里就已经把整个文件读取成功了,下一步应该是要用opengl把整个模型文件描绘出来。