谁有显示OBJ三维文件的C或C++源代码

fffjjjhhh 2016-01-01 05:51:56
谁有显示OBJ三维文件的C或C++源代码,VC或QT的都行。从网上找了一些都只能显示特定的OBJ文件,做不到通用。谢谢了,一定高分相送。
...全文
5499 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
victor_woo 2017-07-05
  • 打赏
  • 举报
回复

void GCObjModel0::preProcess()
{
	FILE* _file = fopen(m_strFileName,"rb");	
	
	char strLine[256];
	
	do{
		if(fgets(strLine,256,_file)==NULL)
			break;
		
		std::string lineCheck(strLine);
		
		trim(lineCheck);

		if(lineCheck.empty())
			continue;
		
		std::string flag(strLine,1);
		
		if(flag=="v")
			VERTEXCOUNT++;
		
		if(flag=="f")
			DELTACOUNT++;	
	}while(1);
	
	fclose(_file);

	//DELTAS 		= new GCTriangle3DX*[DELTACOUNT];
	VERTEXES 	= new GCPosition4D*[VERTEXCOUNT];
}

void GCObjModel0::postProcess()
{
	if(VERTEXES == NULL)
		return;
		
	for(int i =0;i<VERTEXCOUNT;i++)
		delete VERTEXES[i];

	delete VERTEXES;	
	
	VERTEXES = NULL;
	
	GCDeltaModelImpl::postProcess();
}

int GCObjModel0::createDisplayList()
{
	FILE* file = fopen(m_strFileName,"rb");	
	
	char strLine[256];
	
	float vertexdata[3];
	int faceVIndex[3];
	
	char nosense; //数据行第一个符号
	
	int	VERTEXREAD = 0;
		
	int nDisplayListID = glGenLists(1);
	glNewList(nDisplayListID, GL_COMPILE);
	
	glBegin(GL_TRIANGLES);
	
	do{
		if(fgets(strLine,256,file)==NULL)
			break;
		
		std::string lineCheck(strLine);
		
		trim(lineCheck);

		if(lineCheck.empty())
			continue;
		
		std::string flag(strLine,1);
		
		if(flag=="v")
		{
			//20130226 1643 屏蔽obj法矢读取
			sscanf(strLine,"%s %f %f %f"
				,&nosense
				,vertexdata
				,vertexdata+1
				,vertexdata+2
				);
			
			GCPosition4D* p = new GCPosition4D(vertexdata[0],vertexdata[1],vertexdata[2]);
			
			checkMaxMin(vertexdata[0],vertexdata[1],vertexdata[2]);
			
			VERTEXES[VERTEXREAD++] = p;
		}	
		
		if(flag=="f")
		{
			sscanf(strLine,"%s %d %d %d"
				,&nosense
				,faceVIndex
				,faceVIndex+1
				,faceVIndex+2);
			
			GCPosition4D* p1 = VERTEXES[faceVIndex[0]-1];
			GCPosition4D* p2 = VERTEXES[faceVIndex[1]-1];
			GCPosition4D* p3 = VERTEXES[faceVIndex[2]-1];
			
			GCVector4D normal = (GCVector4D(*p1,*p2)|GCVector4D(*p1,*p3)).toUnitVector();
			
			glNormal3d(normal.X(),normal.Y(),normal.Z());
			glVertex3d(p1->X(),p1->Y(),p1->Z());
			glVertex3d(p2->X(),p2->Y(),p2->Z());
			glVertex3d(p3->X(),p3->Y(),p3->Z());	
		}
	}while(1);
	
	glEnd();
	glEndList();
	
	fclose(file);	

	return nDisplayListID;
}

victor_woo 2016-12-08
  • 打赏
  • 举报
回复
先把点坐标读入数组,如果有点法矢,一并读入 读三角形数据, 构造三角片,OK

601

社区成员

发帖
与我相关
我的任务
社区描述
异构开发技术
社区管理员
  • OpenCL和异构编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧