opengles加载多个模型

来源:互联网 发布:淘宝开店如何装修 编辑:程序博客网 时间:2024/06/06 05:15

模型文件格式:

1,用于保存各个模型文件的配置文件格式

<root><!-- pos:初始位置  rot:旋转向量(旋转的方向) scale:缩放系数-->  <node name="1" file="data/model/Box01.sm.xml"    pos="0 0 0"   rot="0 0 0" scale="1 1 1"/>  <node name="1" file="data/model/Sphere01.sm.xml" pos="5 0 0"  rot="0 0 0" scale="1 1 1"/>  <node name="1" file="data/model/Box01.sm.xml"    pos="10 0 0"  rot="0 0 0" scale="1 1 1"/>  <node name="1" file="data/model/Teapot01.sm.xml" pos="15 0 0"  rot="0 0 0" scale="1 1 1"/>  <node name="1" file="data/model/Torus01.sm.xml"  pos="20 0 0"  rot="0 0 0" scale="1 1 1"/>  <node name="1" file="data/model/Box01.sm.xml"    pos="25 0 0"  rot="0 0 0" scale="1 1 1"/>  <node name="1" file="data/model/Box01.sm.xml"    pos="30 0 0"  rot="0 0 0" scale="1 1 1"/>  <node name="1" file="data/model/Box01.sm.xml"    pos="35 0 0"  rot="0 0 0" scale="1 1 1"/>  </root>

2,模型文件格式:

<?xml version="1.0"?><MeshRoot>  <mesh name = "Box01">    <faceIndex size = "12" material ="02 - Default">      <face>0 1 2</face>      <face>2 3 0</face>      <face>4 5 6</face>      <face>6 7 4</face>      <face>0 3 5</face>      <face>5 4 0</face>      <face>3 2 6</face>      <face>6 5 3</face>      <face>2 1 7</face>      <face>7 6 2</face>      <face>1 0 4</face>      <face>4 7 1</face>    </faceIndex>    <vertex size = "8">      <vertexdata>-0.500000 0.000000 0.500000 0.000000 -1.000000 0.000000 1.000000 0.000000</vertexdata>      <vertexdata>-0.500000 0.000000 -0.500000 0.000000 -1.000000 0.000000 1.000000 1.000000</vertexdata>      <vertexdata>0.500000 0.000000 -0.500000 0.000000 -1.000000 0.000000 0.000000 1.000000</vertexdata>      <vertexdata>0.500000 0.000000 0.500000 0.000000 -1.000000 0.000000 0.000000 0.000000</vertexdata>      <vertexdata>-0.500000 1.000000 0.500000 0.000000 1.000000 0.000000 0.000000 0.000000</vertexdata>      <vertexdata>0.500000 1.000000 0.500000 0.000000 1.000000 0.000000 1.000000 0.000000</vertexdata>      <vertexdata>0.500000 1.000000 -0.500000 0.000000 1.000000 0.000000 1.000000 1.000000</vertexdata>      <vertexdata>-0.500000 1.000000 -0.500000 0.000000 1.000000 0.000000 0.000000 1.000000</vertexdata>    </vertex>  </mesh></MeshRoot>


    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 loadScene(const char* fileScene){char* pXML = readFile(fileScene);if (pXML==0){return false;}try{rapidxml::xml_document<> doc;doc.parse<0>(pXML);rapidxml::xml_node<>* pRoot = doc.first_node();rapidxml::xml_node<>* node = pRoot->first_node();for (; node != 0;node=node->next_sibling()){rapidxml::xml_attribute<>* attrName = node->first_attribute("name");//文件路径rapidxml::xml_attribute<>* attrFile = node->first_attribute("file");//初始位置rapidxml::xml_attribute<>* attrPos = node->first_attribute("pos");//初始旋转向量rapidxml::xml_attribute<>* attrRot = node->first_attribute("rot");//初始缩放系数rapidxml::xml_attribute<>* attrScale = node->first_attribute("scale");if (_map.find(attrFile->value())==_map.end()){Model model;load(attrFile->value(), model);_map[attrFile->value()] = model;}Node node;node._fileName = attrFile->value();//格式化数据 获取每个模型初始信息sscanf(attrPos->value(),"%f %f %f",&node._pos.x,&node._pos.y,&node._pos.z);sscanf(attrRot->value(), "%f %f %f", &node._rot.x, &node._rot.y, &node._rot.z);sscanf(attrScale->value(),"%f %f %f",&node._scale.x,&node._scale.y,&node._scale.z);_arNode.push_back(node);}}catch (exception e){}delete[]pXML;return true;}/*model参数传递的是对象的引用根据文件名分别解析对应的面索引信息,顶点信息 ,并且分别将对应信息放入面索引数组,顶点信息数组*/virtual bool load(const char* fileName, Model& mode){std::map<std::string, Model>::iterator itr = _map.find(fileName);char* pXML = readFile(fileName);if (pXML==0){return false;}try{rapidxml::xml_document<> doc;doc.parse<0>(pXML);rapidxml::xml_node<>* pRoot = doc.first_node();rapidxml::xml_node<>* pMesh = pRoot->first_node();rapidxml::xml_node<>* pFaces = pMesh->first_node("faceIndex");rapidxml::xml_node<>* vertexs = pMesh->first_node("vertex");//解析面索引信息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};mode._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);mode._arVertex.push_back(vVert);}}catch (...){}delete[]pXML;return true;}

渲染函数

   virtual void    onRender(const FrameEvent& /*evt*/,int width,int height)        {            glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);            glViewport(0,0,width,height);            _camera.setViewSize(width,height);            _role.render(1.0f/60.0f);                        _camera.setTarget(_role._pos);            _camera.update();            CELL::matrix4   matModel;            matModel.translate(_role._pos);            CELL::matrix4   matView =   _camera.getView();            CELL::matrix4   matProj =   CELL::perspective<float>(45.0f,float(width)/float(height),0.1f,1000.0f);            _camera.setProject(matProj);            CELL::matrix4   MVP     =   matProj * matView ;                       float   gSize   =   100;            float   gPos    =   0;            float   rept    =   100;            Vertex grounds[] =            {                { -gSize, gPos,-gSize,0.0f, 0.0f,1.0f, 1.0f, 1.0f,1.0f,0,1,0 },                {  gSize, gPos,-gSize,rept, 0.0f,1.0f, 1.0f, 1.0f,1.0f,0,1,0 },                {  gSize, gPos, gSize,rept, rept,1.0f, 1.0f, 1.0f,1.0f,0,1,0 },                { -gSize, gPos,-gSize,0.0f, 0.0f,1.0f, 1.0f, 1.0f,1.0f,0,1,0 },                {  gSize, gPos, gSize,rept, rept,1.0f, 1.0f, 1.0f,1.0f,0,1,0 },                { -gSize, gPos, gSize,0.0f, rept,1.0f, 1.0f, 1.0f,1.0f,0,1,0 },            };            _device.bindTexture2D(&_texture);            _shader.begin();            {                                _device.setUniformMatrix4fv(_shader._MVP,1,false,MVP.data());                _device.setUniform1i(_shader._texture,0);                _device.attributePointer(_shader._positionAttr, 3,  GL_FLOAT,false,sizeof(Vertex),&grounds[0].x);                _device.attributePointer(_shader._uvAttr,       2,  GL_FLOAT,false,sizeof(Vertex),&grounds[0].u);                _device.attributePointer(_shader._colorAttr,    4,  GL_FLOAT,false,sizeof(Vertex),&grounds[0].r);                _device.drawArray(GL_TRIANGLES,0,6);                                _device.bindTexture2D(&_textureRole);                MVP =   matProj * matView * matModel;                _device.setUniformMatrix4fv(_shader._MVP,1,false,MVP.data());                _device.attributePointer(_shader._positionAttr, 3,  GL_FLOAT,false,sizeof(Vertex),&boxVertex[0].x);                _device.attributePointer(_shader._uvAttr,       2,  GL_FLOAT,false,sizeof(Vertex),&boxVertex[0].u);                _device.attributePointer(_shader._colorAttr,    4,  GL_FLOAT,false,sizeof(Vertex),&boxVertex[0].r);               // _device.drawArray(GL_TRIANGLES,0,sizeof(boxVertex)/sizeof(boxVertex[0]));                std::vector<Node>::iterator itr = _arNode.begin();                for ( ; itr != _arNode.end() ; ++ itr )                {                    Node&           node        =   *itr;                    Model&          model       =   _map[node._fileName];                    quaternion      quat;                    CELL::matrix4   matWorld    =   CELL::makeTransform(node._pos,node._scale,quat);                    MVP =   matProj * matView * matWorld;                    _device.setUniformMatrix4fv(_shader._MVP,1,false,MVP.data());                    _device.attributePointer(_shader._positionAttr, 3,  GL_FLOAT,false,sizeof(Vertex),&model._arVertex[0].x);                    _device.attributePointer(_shader._uvAttr,       2,  GL_FLOAT,false,sizeof(Vertex),&model._arVertex[0].u);                    _device.attributePointer(_shader._colorAttr,    4,  GL_FLOAT,false,sizeof(Vertex),&model._arVertex[0].r);                    _device.bindTexture2D(&_textureRole);                    _device.drawElements(GL_TRIANGLES,model._arFaces.size() * 3,GL_UNSIGNED_SHORT,&model._arFaces.front());                }            }            _shader.end();        }



原创粉丝点击