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

📄 objfileread.cpp

📁 用VC++实现OBJ文件读取,实现了强大的功能.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// OBJFileRead.cpp: implementation of the COBJFileRead class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "OBJLoader.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)
{
    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 vertices exceeds limit (%d)\n",
		VERTEX_MAX);
	    exit (-1);
	}
    }

    
    model->vertexList[model->vertexCount].draw = 0;

    fclose(dataFile);
} /* End of readLineData */

void COBJFileRead::readObjData(char *FileName)
{
    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->boundBoxNear = 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 + 2;
					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[v1].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->edgeList[model->edgeCount][0] = v0;
					model->edgeList[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') 
		{
			//点
		}
		else if (inputLine[0] == 's') 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -