📄 objfileread.cpp
字号:
// 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 + -