图形学编程学习日志01

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值