图形学编程学习日志01

来源:互联网 发布:网络免费卫星电视直播 编辑:程序博客网 时间:2024/06/03 15:29

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把整个模型文件描绘出来。


原创粉丝点击