opengles加载xml格式的三维模型

来源:互联网 发布:集思宝数据导出 编辑:程序博客网 时间:2024/05/17 04:31

效果图:


模型文件格式


加载模型的代码:

std::vector<Face>   _arFaces;std::vector<Vertex> _arVertex;virtual char* readFile(const char* fileName){FILE* pFile = fopen(fileName, "rb");if (pFile==0){return false;}//指针移动到文件尾fseek(pFile,0,SEEK_END);//获取文件长度size_t length = ftell(pFile);//移动到文件头fseek(pFile,0,SEEK_SET);//申请空间char* pText = new char[length + 1];fread(pText,1,length,pFile);pText[length] = 0;fclose(pFile);return pText;}virtual bool load(const char* fileName){char* pXML = readFile(fileName);if (pXML==0){return false;}try{rapidxml::xml_document<> doc;doc.parse<0>(pXML);//获取最外层跟节点 MeshRootrapidxml::xml_node<>* pRoot = doc.first_node();//获取第二层节点 meshrapidxml::xml_node<>* pMesh = pRoot->first_node();//获取面索引的根节点rapidxml::xml_node<>* pFaces = pMesh->first_node("faceIndex");//获取顶点跟节点rapidxml::xml_node<>* vertexs = pMesh->first_node("vertex");//遍历face节点for (rapidxml::xml_node<>* face = pFaces->first_node(); face != 0;face=face->next_sibling()){int x, y, z;const char* strFace = face->value();sscanf(strFace,"%d %d %d",&x,&y,&z);Face faceIndex = {x,y,z};_arFaces.push_back(faceIndex);}//遍历顶点节点for (rapidxml::xml_node<>* vert = vertexs->first_node(); vert != 0;vert=vert->next_sibling()){Vertex vVert;vVert.r = 1;vVert.g = 1;vVert.b = 1;vVert.a = 1;const char* strVert = vert->value();sscanf(strVert, "%f %f %f %f %f %f %f %f", &vVert.x, &vVert.y, &vVert.z, &vVert.u, &vVert.v, &vVert.nx, &vVert.ny, &vVert.nz);_arVertex.push_back(vVert);}}catch (...){}//释放资源delete[]pXML;return true;}


完整代码下载地址:http://download.csdn.net/detail/hb707934728/9854359


原创粉丝点击