作者:StrongCoding
邮箱:StrongCoding@qq.comDX群:130302441
若文中有误,请告知.十分感谢.一起加油.
这一篇将深入网格模型的基础,看一下,网格模型这个东西,内部到底隐藏了些什么,真的有那么深奥吗?呵呵,不卖关子了,一起来 看看吧:
一、MESH属性表相关
1、获取MESH子集数目
DWORD subsetNumbers = 0;
Mesh->GetAttributeTable( 0,&subsetNumbers);
2、填充MESH属性表
D3DXATTRIBUTERANGE attInfo = new D3DXATTRIBUTERANGE[subsetNumbers];
Mesh->GetAttributeTable( attInfo,&subsetNumbers );
for( int i = 0; i < Mesh->GetNumberFaces(); ++i )
{
attInfo[i].AttribId // 所处子集的ID编号
attInfo[i].FaceStart // 该子集(该属性表)起始的三角形面的索引编号
attInfo[i].FaceCount // 该子集(该属性表)存在的三角形面的总数目
attInfo[i].VertexStart // 该子集(该属性表)组织顶点的起始编号
attInfo[i].VertexCount // 该子集(该属性表)总的顶点数目
}
4、此外你还可以通过属性缓存,来直接获取MESH所有的面,所处的子集编号
Mesh->LockAttributeBuffer(...);
for( int i = 0; i < Mesh->GetNumberFaces(); ++i )
{
attributeInfo[i] // 获取MESH所有的三角形所处的子集ID编号
}
Mesh->UnlockAttributeBuffer();
二、MESH邻接信息相关
所谓的邻接信息,我们只要知道一个大方向就OK,就是记录毗邻相关的三角形数目:
Mesh->GenerateAdjacency( 0.0f,&Adjacency);
for( int i = 0; i < Mesh->GetNumberFaces(); ++i )
{
Adjacency[i*3 ]
Adjacency[i*3+1]
adjacency[i*3+2]
}
三、获取MESH顶点信息
Mesh->LockVertexBuffer( 0,&vb );
for( int i = 0; i < Mesh->GetNumVertex(); ++i )
{
vb[i].x
vb[i].y
vb[i].z
vb[i].u
vb[i].v
vb[i].nx
vb[i].ny
vb[i].nz
}
Mesh->UnlockVertexBuffer();
四、获取MESH索引信息
Mesh->LockIndexBuffer( 0,&ib );
for( int i = 0; i < Mesh->GetNumFaces(); ++i ) { ib[i*3] ib[i*3+1] ib[i*3+2] }
Mesh->UnlockIndexBuffer();