在OGRE中,动态创建Mesh一般有两种方法:其一,通过ManualObject的ConvertToMesh,创建ManualObject是中间过程,ConvertToMesh过后,此创建的ManualObject就可以Remove掉了;其二,通过HardwareBuffer直接创建Mesh。第一种方法相对来说比较简单(就不多说了),下面具体说说第二种方法:
1. 创建Mesh:MeshPtr mesh = MeshManager::getSingleton().createManual("MeshName", "General");
第一个参数:mesh的名称,第二个参数:Mesh所属的组
2. 创建submesh:SubMesh * submesh = mesh->createSubMesh();
3. 创建好了Mesh和SubMesh后,就可以填充VertexBuffer和IndexBuffer了:
1). 需要分配一段内存区间:如float * cube = new float[num],然后填充这段内存:
注意: A.分配区间一定要足够大;B、填充区间的时候可以根据Position、Normal和Coordination(或者SpecularColor,DiffuseColor...)的顺序依次填充每一个定点;也可以分别每一个分配一个单独的buffer区间!
2). 定义VertexDeclaration,如:VertexDeclaration * decl = mesh->sharedVertexData->vertexDeclaration;
然后就可以AddElement:
size_t offset = 0;
decl->addElement(0, offset, VET_FLOAT3, VES_POSITION);
offset += VertexElement::getTypeSize(VET_FLOAT3);
.......
.........
(此处省略号代表要添加的Element的类型,如果需要添加多个Element就可以照上面的顺序依次添加)
3). 创建VertexBuffer:vertexBuffer = HardwareBufferManager::getSingleton().createVertexBuffer(offset, vertexCount, ......);
4). 添加数据到VertexBuffer中:vertexBuffer->writeData(..........);
5). 如果需要分别添加Element,可以重复1-4部;
6)。创建IndexBuffer,方法同VertexBuffer相似,不多说了
4. 填充相关数据:sub->useSharedVertices = true; submesh->indexData->indexBuffer = ibuf; submesh->indexData->indexCount = ibufCount; submesh->indexData->indexStart = 0;
到此步骤,mesh就创建出来了。就可以和OGRE提供的Mesh资源一样使用了^_^
值得一提的是:
创建好的mesh资源,在程序退出(或者重新创建相同名称的Mesh)的时候,务必要通过MeshManager::getSingleton().Unload("MeshName")和Remove("MeshName")将其删除掉。虽然程序退出的时候,系统会自动去掉,不过有时候也会出现相关的错误!!!!