模型是由很多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為一組做挑選。

創作者介紹

StreamWhite

teexit1224 發表在 痞客邦 PIXNET 留言(0) 人氣()