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(); }
阅读全文
1 0
- opengles加载多个模型
- opengles加载xml格式的三维模型
- opengles之3D模型加载(obj模型文件)
- Tensorflow加载多个模型
- Android OpenglES 绘制多个纹理
- OpenGLES---加载纹理
- OpenGLES---加载文字
- opengles加载obj格式3D模型含光照和纹理
- 分享多个基于QML/Opengles的炫彩效果
- OpenGLES---模型/观察/投影矩阵
- 第一个OpenGLES小程序
- opengles
- opengles
- opengles
- Opengles
- OpenGLES
- OpenGLES加载tga文件为纹理
- OpenGLES加载BMP文件为纹理
- DBMS_REDEFINITION在线重定义表
- dualpal-section1.2
- Android开发规范和架构总结
- system()正确应用
- office文档图标显示不正常
- opengles加载多个模型
- 水经注CAD智能影像加载插件教程
- Python的条件语句与运算符优先级详解(2)
- Apache域名从定向
- CSS3选择器(全)
- mysql学习日志三
- YTU3141--神奇的口袋(dp背包变式)
- 高效程序员的 7 个共同特征
- java-自定义的进制转换-可以处理缩短uuid长度的问题