📄 objfileread.cpp
字号:
// OBJFileRead.cpp: implementation of the COBJFileRead class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MySDOpenGL.h"
#include "OBJFileRead.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
COBJFileRead::COBJFileRead()
{
}
COBJFileRead::~COBJFileRead()
{
}
void COBJFileRead::readLineData(char *FileName,ModelContext *model)
{
FILE *dataFile;
char inputLine[256];
GLfloat x,y,z;
GLfloat r,g,b;
int count;
dataFile=fileOpen(FileName,"r");
if(dataFile==NULL)
exit(1);
model->haveNormals=0;
model->vertexCount=0;
model->colorCount=0;
model->colorList[0].index=-1;
//读入线数据直到文件结尾
while((fgets(inputLine,250,dataFile)!=NULL)&&(inputLine[0]!='e')){
if(inputLine[0]=='m'){
count=sscanf(inputLine,"m %f %f %f",&x,&y,&z);
model->vertexList[model->vertexCount].draw=0;
}
if(inputLine[0]=='d'){
count=sscanf(inputLine,"d %f %f %f",&x,&y,&z);
model->vertexList[model->vertexCount].draw=1;
}
if(inputLine[0]=='c'){
count=sscanf(inputLine,"c %f %f %f",&r,&g,&b);
model->colorList[model->colorCount].index=model->vertexCount;
model->colorList[model->colorCount].rd=r;
model->colorList[model->colorCount].gd=g;
model->colorList[model->colorCount].bd=b;
model->colorList[model->colorCount].ad=1.0;
if(model->colorCount+1<COLOR_MAX){
model->colorCount++;
}
else{
//颜色数量太多,显示错误提示
fprintf(stderr,"Error,number of colors exceeds limit(%d)\n",COLOR_MAX);
}
continue;
}
if(count!=3)
continue;
model->vertexList[model->vertexCount].x=x;
model->vertexList[model->vertexCount].y=y;
model->vertexList[model->vertexCount].z=z;
if(model->vertexCount+1<VERTEX_MAX){
model->vertexCount++;
}
else{
//顶点数量太多,显示错误提示
fprintf(stderr,"Error,number of verticess exceeds limit(%d)\n",VERTEX_MAX);
exit(-1);
}
}
model->vertexList[model->vertexCount].draw=0;
fclose(dataFile);
}
void COBJFileRead::readObjData(char *FileName,ModelContext *model)
{
FILE *datafile; //读入的文件
int count; //输入数量的计数器
char inputLine[512];
int ilLen; //线的长度
GLfloat x,y,z; //顶点座标
int facetVertex[100]; //面的顶点序列
int facetNormal[100]; //面的法向量
int fvCount; //在面中的顶点数
int linePos,lp; //输入线的位置
int i,j,k,m;
char materialName[128]; //材质文件
MaterialColor *materials; //材质描述的指针
MaterialColor *matPtr;
int foundMatch;
int v0,v1;
glFrontFace(GL_CCW);
datafile=fileOpen(FileName,"r");
if(datafile==NULL){
perror(FileName);
exit(1);
}
materials=NULL;
model->facetCount=0;
model->haveNormals=0;
model->ovCount=1; //顶点数从1开始
model->onCount=1;
model->vertexCount=0;
model->edgeCount=0;
model->lineCount=0;
model->lineStripCount=0;
model->colorCount=0;
model->colorList[0].index=-1;
model->boundBoxLeft=0;
model->boundBoxRight=0.0;
model->boundBoxBottom=0.0;
model->boundBoxTop=0.0;
model->boundBoxNear=0.0;
model->boundBoxFar=0.0;
for(;;){
if(fgets(inputLine,500,datafile)==NULL)
break; //文件结尾
//获得线的长度
ilLen=strlen(inputLine);
while((ilLen>0)&&((inputLine[ilLen-1]==' ')||(inputLine[ilLen-1]=='\n')))
ilLen--;
if(inputLine[0]=='v'){
//读入一个顶点,并将其保存到点的数组中
if(inputLine[1]==' '){
//一个顶点
count=sscanf(inputLine,"v %f %f %f",&x,&y,&z);
if(count!=3)
continue;
model->objVertexList[model->ovCount].facetsNum=0;
model->objVertexList[model->ovCount].edgesNum=0;
model->objVertexList[model->ovCount].x=x;
model->objVertexList[model->ovCount].y=y;
model->objVertexList[model->ovCount++].z=z;
//更新边界盒
if(x<model->boundBoxLeft)
model->boundBoxLeft=x;
if(x>model->boundBoxRight)
model->boundBoxRight=x;
if(y<model->boundBoxBottom)
model->boundBoxBottom=y;
if(y>model->boundBoxTop)
model->boundBoxTop=y;
if(z<model->boundBoxNear)
model->boundBoxLeft=z;
if(z>model->boundBoxFar)
model->boundBoxFar=z;
}
else if(inputLine[1]=='n'){
//法向量
count=sscanf(inputLine,"vn %f %f %f",&x,&y,&z);
if(count!=3)
continue;
model->objVertexList[model->onCount].nx=x;
model->objVertexList[model->onCount].ny=y;
model->objVertexList[model->onCount++].nz=z;
model->haveNormals=1;
}
}
else if(inputLine[0]=='f'){
//读入一个面,获得顶点的坐标
fvCount=0;
linePos=2;
while(linePos<ilLen){
//获得下一个数
sscanf(&inputLine[linePos],"%d%n",&facetVertex[fvCount],&lp);
if(inputLine[linePos+lp]=='/'){
linePos+=lp;
sscanf(&inputLine[linePos],"/%d%n",&facetNormal[fvCount],&lp);
linePos+=lp;
sscanf(&inputLine[linePos],"/%d%n",&facetNormal[fvCount],&lp);
}
fvCount++;
linePos+=lp+1;
}
if(fvCount<3)
continue; //不是多边形
facetVertex[fvCount]=facetVertex[0];
//转换顶点数为XYZ
for(i=0;i<fvCount;i++){
if(facetVertex[i]<facetVertex[i+1]){
v0=facetVertex[i];
v1=facetVertex[i+1];
}
else{
v0=facetVertex[i+1];
v1=facetVertex[i];
}
foundMatch=0;
for(j=0;j<model->objVertexList[v0].facetsNum;j++){
for(k=0;k<model->objVertexList[v0].facetsNum;k++){
if(model->objVertexList[v0].facets[j]==
model->objVertexList[v1].facets[k]){
if(model->objVertexList[v0].facets[j]!=model->facetCount){
foundMatch=1;
break;
}
}
}
if(foundMatch)
break;
}
if(foundMatch==0){
model->objVertexList[v0].edges[
model->objVertexList[v0].edgesNum++]=model->edgeCount;
model->objVertexList[v1].edges[
model->objVertexList[v1].edgesNum++]=model->edgeCount;
model->eadgeList[model->edgeCount][0]=v0;
model->eadgeList[model->edgeCount][1]=v1;
model->edgeCount++;
}
//添加该面到顶点记录中
model->objVertexList[v0].facets[
model->objVertexList[v0].facetsNum++]=model->facetCount;
model->objVertexList[v1].facets[
model->objVertexList[v1].facetsNum++]=model->facetCount;
j=i;
//将顶点作为三角形或多边形读入
if(model->triangleFlag){
if(j>0){
if((i&1)==1)
j=(i+1)>>1;
else
j=fvCount-(i>>1);
}
}
model->vertexList[model->vertexCount].draw=i;
model->vertexList[model->vertexCount].x=
model->objVertexList[facetVertex[j]].x;
model->vertexList[model->vertexCount].y=
model->objVertexList[facetVertex[j]].y;
model->vertexList[model->vertexCount].z=
model->objVertexList[facetVertex[j]].z;
if(model->haveNormals){
model->vertexList[model->vertexCount].nx=
model->objVertexList[facetNormal[j]].nx;
model->vertexList[model->vertexCount].ny=
model->objVertexList[facetNormal[j]].ny;
model->vertexList[model->vertexCount].nz=
model->objVertexList[facetNormal[j]].nz;
}
model->objVertexList[facetVertex[j]].vertexIndex=
model->vertexCount;
model->vertexCount++;
}
model->facetCount++;
}
else if(inputLine[0]=='l'){
//线
}
else if(inputLine[0]=='p'){
//点
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -