Ogre中mesh的顶点数据与索引数据
来源:互联网 发布:iphone 改铃声 mac 编辑:程序博客网 时间:2024/06/10 06:28
【转】Ogre的mesh的顶点数据与索引数据
转载自:http://blog.csdn.net/zhuxiaoyang2000/article/details/6565962
//读取的数据用于物理引擎的计算/** * 获取Ogre的Mesh信息* @param mesh: Ogre的Mesh指针* @return void*/void ActorNode::GetMeshInformation(const Ogre::Mesh* const mesh, size_t &vertex_count,Ogre::Vector3* &vertices, size_t &index_count,unsigned long* &indices, const Ogre::Vector3 &position /* = Ogre::Vector3::ZERO */, const Ogre::Quaternion &orient /* = Ogre::Quaternion::IDENTITY */, const Ogre::Vector3 &scale /* = Ogre::Vector3::UNIT_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); // 只需要添加the shared vertices一次 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;}// Allocate space for the vertices and indices// 分配内存vertices = new Ogre::Vector3[vertex_count];indices = new unsigned long[index_count];added_shared = false;// 添加具体的数据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_READ_ONLY)); // There is _no_ baseVertexPointerToElement() which takes an Ogre::Real or a double // as second argument. So make it float, to avoid trouble when Ogre::Real will // be comiled/typedefed as double: //Ogre::Real* pReal; 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); 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; }}
- Ogre中mesh的顶点数据与索引数据
- Ogre中获取mesh顶点数据
- Ogre 处理顶点/索引数据
- Ogre处理顶点/索引数据
- ogre获取Mesh的顶点数组和索引数组
- Ogre中mesh共享顶点缓存的使用
- Ogre中Mesh的加载与渲染流程
- Ogre中Mesh的加载与渲染流程
- Mesh 顶点的Normal
- .obj文件中顶点数据的合并
- 修改OGRE中模型的顶点色
- 修改OGRE中模型的顶点色
- Ogre Mesh的加载
- Ogre Mesh的加载
- OGRE -- Mesh的使用方法
- Ogre中手动创建mesh
- Ogre中手动创建mesh
- OGRE中MESH文件格式分析
- 预处理+编译+汇编+连接
- 给textview设置四周边框和底部边框
- JS弹窗和对话框大全
- Exe
- HDU4547(CD操作)LCA+Tarjan离线算法
- Ogre中mesh的顶点数据与索引数据
- 本地mysql链接远程数据库
- 别浪费自己的高学历
- initWithNibName 和 loadNibNamed 的区别
- DOS命令之path
- Interval Intersections
- 静态网站全站搜索功能
- 【高手分享】熟知Win7系统(英文版)分区14个小步骤
- ORACLE数据库学习03