none
Mesh DirectX : lister face et vertices RRS feed

  • Question

  • Bonjour à tous, je n'ai pas trouvé de forum DirectX (ce qui m'a étonné d'ailleurs ^^) donc je poste ici, j'espère que c'est le bon endroit (en même temps je code avec C# .Net pour utiliser DirectX)

     

    Ma question est la suivante : j'aimerais pouvoir analyser un mesh afin de pouvoir déduire quel sont ses Vertices (points qui sorte du mesh) et ses faces : triangles en tant qu'indice de ces Vertices

     

    Je pense que cela doit pouvoir se calculer à partir du vertex buffer (Vertice) et de l'index Buffer (liste d'utilisation des vertices pour trouver les faces) mais il existe plusieurs méthode pour agencer tout ceci, et je me trouve incapable de retrouver cela. De plus, il existe peut être un descendant de mesh que je pourrais utiliser qui fait tout ça très bien et vite ;-) dans Direct3DX peut être...

     

    voici le code (les extrait interressant) que j'ai commencer à faire (la partie utilisant l'index buffer plante à l'execution) il me semble que ma liste de Vertice est correct...

     

    Code Snippet

    Mesh mesh

     

     

     

    #region Polygon

    CustomVertex.PositionOnly[] MesVertices;

    int[] MesIndices;

    int[][] MesFaces;

    System.Collections.Generic.List<CustomVertex.PositionOnly> MesPoints = new List<CustomVertex.PositionOnly>();

    public System.Collections.Generic.List<CustomVertex.PositionOnly> getPolygon()

    { return MesPoints; }

    protected void InitPointsPolygon()

    {//pas correct, à étudier

    CustomVertex.PositionOnly[] aV3 = new CustomVertex.PositionOnly[this.mesh.NumberVertices];

    aV3 = (CustomVertex.PositionOnly[])this.mesh.LockVertexBuffer(typeof(CustomVertex.PositionOnly), LockFlags.ReadOnly, this.mesh.NumberVertices);

    this.mesh.UnlockVertexBuffer();

    MesIndices = new int[this.mesh.NumberFaces*3];

    MesIndices = (int[])this.mesh.LockIndexBuffer(typeof(int), LockFlags.ReadOnly,MesIndices);

    this.mesh.UnlockIndexBuffer();

    MesVertices = aV3;

    for (int i = 0; i < aV3.Length; i++)

    {

    bool present = false;

    for (int j = 0; j < MesPoints.Count; ++j)

    if (MesPoints[j].X == aV3[i].X && MesPoints[j].Y == aV3[i].Y && MesPoints[j].Z == aV3[i].Z)

    present = true;

    if (!present)

    MesPoints.Add(aV3[i]);

    }

    //:S

    MesFaces = new int[MesIndices.Length / 3][];

    for (int i = 0; i < MesIndices.Length / 3; ++i)

    {

    MesFaces[i] = new int[3];

    for (int j = 0; j < 3; ++j)

    MesFaces[i][j] = MesIndices[3 * i + j];

    }

    }

    public int GetNumberVertices()

    { return mesh.NumberVertices; }

    public int GetNumberFaces()

    { return mesh.NumberFaces; }

    public Vector3[] GetVertices()

    {

    Vector3[] V = new Vector3[this.MesVertices.Length];

    for (int i = 0; i < this.MesVertices.Length; ++i)

    {

    V[i].X = this.MesVertices[i].X;

    V[i].Y = this.MesVertices[i].Y;

    V[i].Z = this.MesVertices[i].Z;

    }

    return V;

    }

    public CustomVertex.PositionOnly[] GetVerticesVertex()

    { return this.MesVertices; }

    public int[] GetIndices()

    { return this.MesIndices; }

    public int[][] GetFaces()

    { return this.MesFaces; }

    #endregion

     

     

     

    Mes mesh s'affichent correctement pour ce qui concerne le reste...

     

    Je vous remercie d'avance pour votre aide!

    Justin

    dimanche 17 juin 2007 16:15