1

C# と XNA 4.0 を使用して FBX モデルの頂点を繰り返し処理しようとしています。頂点にアクセスできるようになれば、顔の法線やエッジなどの他の部分に自分でアクセスできるようになると思いますPolygonVertexIndex

XNA 3.0 を使用してこれを行う方法について説明している Jon Watte の記事を見つけました 。Extracting Vertices and Triangles from an XNA Model ですが、彼が使用した 3.0 構造は 4.0 には存在しないようです。

特に、彼は次のように頂点にアクセスします。

Vector3[] a = new Vector3[myModelMeshPart.NumVertices];
myModelMesh.VertexBuffer.GetData<Vector3>(myModelMeshPart.StreamOffset + myModelMeshPart.BaseVertex * myModelMeshPart.VertexStride,
          a, 0, myModelMeshPart.NumVertices, myModelMeshPart.VertexStride);

しかし、XNA 4 ではVertexBuffer、 のプロパティではないようですMeshModel

Model誰かが aの頂点の基本的な繰り返しに私を導くことができますか?

ありがとうございました。

@user2340634 返信ありがとうございます。
私の試みは、実際の頂点の数よりもはるかに少ないものでした。
VertexBuffer の使い方が分からないと思います。このコードについてコメントしていただけますか?

private void getVerts(Model mdl)
{
    foreach (ModelMesh mm in mdl.Meshes)
    {
        foreach (ModelMeshPart mp in mm.MeshParts)
        {
            VertexBuffer vb = mp.VertexBuffer;
            short[] s = new short[mp.PrimitiveCount * 3];
            IndexBuffer ib = mp.IndexBuffer;
            ib.GetData<short>(mp.StartIndex * 2, s, 0, mp.PrimitiveCount * 3);

            Vector3[] v = new Vector3[4];
            VertexPositionNormalTexture[] vert = new VertexPositionNormalTexture[4];
            mp.VertexBuffer.GetData<VertexPositionNormalTexture>(vert, 0, mp.NumVertices);
            for (int i = 0; i < v.Length; i++)
            {
                v[i] = vert[i].Position;
                trace("(" + v[i].X.ToString() + ", " + v[i].Y.ToString() + ", " + v[i].Z.ToString() + ")");
            }
        }
    }
}

頂点を反復処理する実際のサンプルはありますか?

4

3 に答える 3

2

「モデル」には「VertexBuffer」がありません。「ModelMesh」には「VertexBuffer」もありません。しかし、「ModelMeshPart」には確かに「VertexBuffer」があることがわかりました。初めて .fbx からのデータ抽出も行っています。プロジェクトに含めるモデルはすべて、ModelMeshPart に保存する必要があります。それはそれほど悪くはありません。.fbx 内のメッシュ全体を 1 つのパーツと見なすことができます。

于 2013-05-01T19:34:41.473 に答える
0

これが私の解決策です(モデルに複数の部分がある場合は、もちろんそれらをループする必要があります)

public static void ModelData(Model model)
{
    ModelMeshPart part = model.Meshes[0].MeshParts[0];

    VertexPositionNormalTexture[] vertices = new VertexPositionNormalTexture[part.VertexBuffer.VertexCount];
    part.VertexBuffer.GetData<VertexPositionNormalTexture>(vertices);

    ushort[] drawOrder = new ushort[part.IndexBuffer.IndexCount];
    part.IndexBuffer.GetData<ushort>(drawOrder);

}
于 2014-06-13T15:51:52.553 に答える