⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objfileread.cpp

📁 机器人运动学动力学及控制的一个小程序,供有兴趣的人参考
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -