模型是由很多Vertex所組成的,在content pipeline中會將3D model轉換成XNB檔案。
然後在Content.Load這個指令再去讀取XNB檔案。
讀取進來以後,裡面就會有3D model有的資料(像是vertex, normal, texture coordniate等)
而我們要如何取出這些資訊呢?
我們需要準備N個容器(如果只要抓取Vertex就只要一個容器即可)。
在ContentLoad當中,我們載入模型以後,再將頂點資訊打撈出來。
方法如下:
mModel = Content.Load<Model>("tank");
foreach (ModelMesh mesh in mModel.Meshes)
{
foreach (ModelMeshPart meshPart in mesh.MeshParts)
{
VertexBuffer vb = meshPart.VertexBuffer;
float[] verticesData = new float[meshPart.NumVertices * vb.VertexDeclaration.VertexStride];
vb.GetData(verticesData);
for (int i = 0; i < verticesData.Length; i += vb.VertexDeclaration.VertexStride)
{
Vector3 vertex = new Vector3(verticesData[i], verticesData[i + sizeof(float)]
, verticesData[i + 2 * sizeof(float)]);
mVertex.Add(vertex);
}
}
}
主要是從meshPart中拿出VertexBuffer然後再取出相關資訊。
用上述方法就可以將XNB檔案裏面的資訊把它拿出來(這邊所拿出來的是Vertex)
有個重點是for迴圈的部分i += vb.VertexDeclaration.VertexStride
這邊數值是32...
Vertex * 3, 每個vertex 4 byte.
Nomal * 3, 每個normal 4 byte.
TexCoord *2, 每個texCoord 4 byte.
所以總共 (3+3+2) * 4 = 32
所以在取資料的時候是每vb.VertexDeclaration.VertexStride為一組做挑選。