Ogre处理顶点/索引数据
2012-09-14 16:01
483 查看
原文摘自:http://blog.csdn.net/zhuxiaoyang2000/article/details/6565962
zhuxiaoyang2000的博客。
下面是我的应用:
zhuxiaoyang2000的博客。
下面是我的应用:
void GameState::updateMesh(const Ogre::MeshPtr mesh) { bool added_shared=false; size_t current_offset=0; size_t shared_offset=0; size_t next_offset=0; for(unsigned short i=0;i<mesh->getNumSubMeshes();++i) { Ogre::SubMesh* submesh=mesh->getSubMesh(i); Ogre::VertexData* vertex_data=submesh->useSharedVertices?mesh->sharedVertexData:submesh->vertexData; if((!submesh->useSharedVertices)||(submesh->useSharedVertices&&!added_shared)) { if(submesh->useSharedVertices) { added_shared=true; shared_offset=current_offset; } const Ogre::VertexElement* posElem=vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION); Ogre::HardwareVertexBufferSharedPtr vbuf=vertex_data->vertexBufferBinding->getBuffer(posElem->getSource()); unsigned char* vertex=static_cast<unsigned char*>(vbuf->lock(Ogre::HardwareBuffer::HBL_NORMAL)); float *pReal; for(size_t j=0;j<vertex_data->vertexCount;j++,vertex+=vbuf->getVertexSize()) { //get vertex data posElem->baseVertexPointerToElement(vertex,&pReal); pReal[2]+=10; } vbuf->unlock(); next_offset+=vertex_data->vertexCount; } } } void GameState::getMeshInfo(const Ogre::MeshPtr mesh, size_t &vertex_count, Ogre::Vector3* &vertices, size_t &index_count, unsigned long* &indices, const Ogre::Vector3& position, const Ogre::Quaternion &orient, const Ogre::Vector3& scale) { bool added_shared=false; size_t current_offset=0; size_t shared_offset=0; size_t next_offset=0; size_t index_offset=0; vertex_count=index_count=0; //索引的总数和顶点的总数 //计算需要多少个索引顶点和顶点 for(unsigned short i=0;i<mesh->getNumSubMeshes();++i) { Ogre::SubMesh* submesh=mesh->getSubMesh(i); //we only need to add the shared vertices once if(submesh->useSharedVertices) { if(!added_shared) { vertex_count+=mesh->sharedVertexData->vertexCount; added_shared=true; } } else { vertex_count+=submesh->vertexData->vertexCount; } //Add the indices index_count+=submesh->indexData->indexCount; } //为顶点和索引缓存申请内存空间 vertices=new Ogre::Vector3[vertex_count]; indices=new unsigned long[index_count]; added_shared=false; //Run through the submeshes again adding the data into arrays for(unsigned short i=0;i<mesh->getNumSubMeshes();++i) { Ogre::SubMesh* submesh=mesh->getSubMesh(i); Ogre::VertexData* vertex_data=submesh->useSharedVertices?mesh->sharedVertexData:submesh->vertexData; if((!submesh->useSharedVertices)||(submesh->useSharedVertices &&!added_shared)) {//没有使用共享顶点 或者是使用共享顶点并且added_shared==false //如果是共享顶点的方式的 if(submesh->useSharedVertices) { added_shared=true; shared_offset=current_offset; } const Ogre::VertexElement* posElem=vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION); Ogre::HardwareVertexBufferSharedPtr vbuf=vertex_data->vertexBufferBinding->getBuffer(posElem->getSource()); unsigned char* vertex=static_cast<unsigned char*>(vbuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY)); float* pReal; for(size_t j=0;j<vertex_data->vertexCount;++j,vertex+=vbuf->getVertexSize()) { posElem->baseVertexPointerToElement(vertex,&pReal); Ogre::Vector3 pt(pReal[0],pReal[1],pReal[2]); vertices[current_offset+j]=(orient*(pt*scale))+position; } vbuf->unlock(); next_offset+=vertex_data->vertexCount; } Ogre::IndexData* index_data=submesh->indexData;//获得索引缓存 size_t numTris=index_data->indexCount/3;//三角形数目 Ogre::HardwareIndexBufferSharedPtr ibuf=index_data->indexBuffer; bool use32bitindexes=(ibuf->getType()==Ogre::HardwareIndexBuffer::IT_32BIT); unsigned long* pLong=static_cast<unsigned long*>(ibuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY)); unsigned short* pShort=reinterpret_cast<unsigned short*>(pLong);//如果不是32位的话 使用 size_t offset=(submesh->useSharedVertices)?shared_offset:current_offset; //获得偏移量 if(use32bitindexes) { for(size_t k=0;k<numTris*3;++k) { indices[index_offset++]=pLong[k]+static_cast<unsigned long>(offset); } } else { for(size_t k=0;k<numTris*3;++k) { indices[index_offset++]=static_cast<unsigned long>(pShort[k])+ static_cast<unsigned long>(offset); } } ibuf->unlock(); current_offset=next_offset; } } void GameState::createColourCube() { Ogre::MeshPtr msh=MeshManager::getSingleton().createManual( "ColourCube","General"); //create one submesh SubMesh* sub=msh->createSubMesh(); const float sqrt13=0.577350269f; //定义顶点 ,8个顶点,每个顶点包含2组 const size_t nVertices=8; const size_t nbufCount=3*2*nVertices; float vertices[nbufCount]= { -100.0,100.0,-100.0, //0 position -sqrt13,sqrt13,-sqrt13, //0 normal 100.0,100.0,-100.0, //1 position sqrt13,sqrt13,-sqrt13, //1 normal 100.0,-100.0,-100.0, //2 position sqrt13,-sqrt13,-sqrt13, //2 normal -100.0,-100.0,-100.0, //3 position -sqrt13,-sqrt13,-sqrt13, //3 normal -100.0,100.0,100.0, //4 position -sqrt13,sqrt13,sqrt13, //4 normal 100.0,100.0,100.0, //5 position sqrt13,sqrt13,sqrt13, //5 normal 100.0,-100.0,100.0, //6 position sqrt13,-sqrt13,sqrt13, //6 normal -100.0,-100.0,100.0, //7 position -sqrt13,-sqrt13,sqrt13, //7 normal }; RenderSystem* rs=Root::getSingleton().getRenderSystem(); RGBA colours[nVertices]; RGBA *pColour=colours; //用于保存顶点的颜色 从 0到7 // // Use render system to convert colour value since colour packing varies rs->convertColourValue(ColourValue(1.0,0.0,0.0), pColour++); //0 colour rs->convertColourValue(ColourValue(1.0,1.0,0.0), pColour++); //1 colour rs->convertColourValue(ColourValue(0.0,1.0,0.0), pColour++); //2 colour rs->convertColourValue(ColourValue(0.0,0.0,0.0), pColour++); //3 colour rs->convertColourValue(ColourValue(1.0,0.0,1.0), pColour++); //4 colour rs->convertColourValue(ColourValue(1.0,1.0,1.0), pColour++); //5 colour rs->convertColourValue(ColourValue(0.0,1.0,1.0), pColour++); //6 colour rs->convertColourValue(ColourValue(0.0,0.0,1.0), pColour++); //7 colour //Define 12 个三角形 const size_t ibufCount=36; unsigned short faces[ibufCount]= { 0,2,3, 0,1,2, 1,6,2, 1,5,6, 4,6,5, 4,7,6, 0,7,4, 0,3,7, 0,5,1, 0,4,5, 2,7,3, 2,6,7 }; //create vertex data structure for 8 vertices shared between submeshes msh->sharedVertexData=new VertexData(); msh->sharedVertexData->vertexCount=nVertices; //创建顶点声明 VertexDeclaration* decl=msh->sharedVertexData->vertexDeclaration; size_t offset=0; decl->addElement(0,offset,VET_FLOAT3,VES_POSITION); offset+=VertexElement::getTypeSize(VET_FLOAT3); decl->addElement(0,offset,VET_FLOAT3,VES_NORMAL); offset+=VertexElement::getTypeSize(VET_FLOAT3); //decl->addElement(0,offset,VET_COLOUR,VES_DIFFUSE); //offset+=VertexElement::getTypeSize(VET_COLOUR); HardwareVertexBufferSharedPtr vbuf= HardwareBufferManager::getSingleton().createVertexBuffer( offset,msh->sharedVertexData->vertexCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY); //upload the vertex data to the card vbuf->writeData(0,vbuf->getSizeInBytes(),vertices,true); //set vertex buffer binding so buffer 0 is bound to our vertex buffer VertexBufferBinding* bind=msh->sharedVertexData->vertexBufferBinding; bind->setBinding(0,vbuf); ////2nd buffer offset=0; decl->addElement(1,offset,VET_COLOUR,VES_DIFFUSE); offset+=VertexElement::getTypeSize(VET_COLOUR); vbuf=HardwareBufferManager::getSingleton().createVertexBuffer( offset,msh->sharedVertexData->vertexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY); vbuf->writeData(0,vbuf->getSizeInBytes(),pColour,true); bind->setBinding(1,vbuf); //Allocate index buffer of the requested number of vertices HardwareIndexBufferSharedPtr ibuf=HardwareBufferManager::getSingleton().createIndexBuffer( HardwareIndexBuffer::IT_16BIT,ibufCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY); //upload the index data to the card ibuf->writeData(0,ibuf->getSizeInBytes(),faces,true); //set parameters of the submesh sub->useSharedVertices=true; sub->indexData->indexBuffer=ibuf; sub->indexData->indexCount=ibufCount; sub->indexData->indexStart=0; msh->_setBounds(AxisAlignedBox(-100,-100,-100,100,100,100)); msh->_setBoundingSphereRadius(Math::Sqrt(3*100*100)); msh->load(); } void GameState::createScene() { createColourCube(); MaterialPtr material = MaterialManager::getSingleton().create( "Test/ColourTest", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); material->getTechnique(0)->getPass(0)->setVertexColourTracking(TVC_AMBIENT); Entity* thisEntity = m_pSceneMgr->createEntity("hello", "ColourCube"); thisEntity->setMaterialName("Test/ColourTest"); updateMesh(thisEntity->getMesh()); SceneNode* thisSceneNode = m_pSceneMgr->getRootSceneNode()->createChildSceneNode(); thisSceneNode->attachObject(thisEntity); size_t vertex_count,index_count; Ogre::Vector3* vertices; unsigned long* indices; getMeshInfo(thisEntity->getMesh(), vertex_count,vertices,index_count,indices); Ogre::String output; stringstream ss; ss<<"*******************Vertices in mesh:"; ss<<vertices[0].x<<" "<<vertices[0].y<<" "<<vertices[0].z<<" "; ss<<vertices[1].x<<" "<<vertices[1].y<<" "<<vertices[1].z<<" "; ss<<vertices[2].x<<" "<<vertices[2].y<<" "<<vertices[2].z<<" "; ss<<vertices[3].x<<" "<<vertices[3].y<<" "<<vertices[3].z<<" "; ss<<vertices[4].x<<" "<<vertices[4].y<<" "<<vertices[4].z<<" "; ss<<vertices[5].x<<" "<<vertices[5].y<<" "<<vertices[5].z<<" "; ss<<vertices[6].x<<" "<<vertices[6].y<<" "<<vertices[6].z<<" "; ss<<vertices[7].x<<" "<<vertices[7].y<<" "<<vertices[7].z<<" "; ss<<"************************"; output=ss.str(); LogManager::getSingleton().logMessage(output); }
在这之后,就可以查看Log文件打印出来的点的坐标了。
相关文章推荐
- Ogre 处理顶点/索引数据
- Ogre中mesh的顶点数据与索引数据
- 基因数据处理67之bwa建立索引时间
- 织梦arclist,channel,list等标签获得当前处理的数据索引
- [翻译]处理顶点数据
- 数据库,唯一索引,重复数据处理
- 基因数据处理23之BWASW算法ref分块建立索引然后比对(ref切分为四段,read为25000条)
- 处理模型——通过扩展模型处理器直接访问顶点位置数据
- Ogre中获取mesh顶点数据
- 处理模型——通过扩展模型处理器直接处理每个ModelMesh的顶点位置数据
- SqlServer 创建聚集索引与非聚集索引处理千万条数据的优化,以及之间的区别
- “跨库导数据”、“事故处理”、“创建索引”、“使用触发器”等常用操作
- 索引优化时如何处理Date数据类型
- 处理模型——通过定义一个自定义的TypeWriter和TypeReader直接处理顶点位置数据
- 大数据下xapian建索引速度问题可能的解决方案以及索引数据的压缩处理
- 基因数据处理4之BWA索引内存不够
- 数据库中的事务、视图、序列 、同义词、索引、数据字典、PL/SQL块 、异常处理、存储过程
- 基因数据处理20之BWASW算法ref分块建立索引然后比对
- Ogre 获取实体顶点和索引
- 【Python数据分析与展示】(六)处理缺失数据,层次化索引