2013-10-11 2 views
1

Je tente de lire dans un maillage à partir d'un fichier .dae vers un projet DirectX en utilisant TinyXML et j'ai de la difficulté à comprendre comment les fichiers .dae stockent les données de maillage.Comment les fichiers .dae stockent-ils les données de maillage?

je crois que je l'ai trouvé où les données de maillage sont stockées: dans la balise <library_geometries> il y a le code suivant:

<library_geometries> 
    <geometry id="Tall_bodyShape" name="Tall_bodyShape"> 
     <mesh> 
      <source id="Tall_bodyShape-positions" name="position"> 
       <float_array id="Tall_bodyShape-positions-array" count="2910"> *** lots of numbers *** </float_array> 
       <technique_common> 
        <accessor source="#Tall_bodyShape-positions-array" count="970" stride="3"> 
         <param name="X" type="float"/> 
         <param name="Y" type="float"/> 
         <param name="Z" type="float"/> 
        </accessor> 
       </technique_common> 
      </source> 
      <source id="Tall_bodyShape-normals" name="normal"> 
       <float_array id="Tall_bodyShape-normals-array" count="3948"> *** lots of numbers *** </float_array> 
       <technique_common> 
        <accessor source="#Tall_bodyShape-normals-array" count="1316" stride="3"> 
         <param name="X" type="float"/> 
         <param name="Y" type="float"/> 
         <param name="Z" type="float"/> 
        </accessor> 
       </technique_common> 
      </source> 
      <source id="Tall_bodyShape-UVChannel_1" name="UVChannel_1"> 
       <float_array id="Tall_bodyShape-UVChannel_1-array" count="2892"> *** lots of numbers *** </float_array> 
       <technique_common> 
        <accessor source="#Tall_bodyShape-UVChannel_1-array" count="1446" stride="2"> 
         <param name="S" type="float"/> 
         <param name="T" type="float"/> 
        </accessor> 
       </technique_common> 
      </source> 
      <vertices id="Tall_bodyShape-vertices"> 
       <input semantic="POSITION" source="#Tall_bodyShape-positions"/> 
      </vertices> 
      <triangles material="Tall_bodySG" count="1883"> 
       <input semantic="VERTEX" source="#Tall_bodyShape-vertices" offset="0"/> 
       <input semantic="NORMAL" source="#Tall_bodyShape-normals" offset="1"/> 
       <input semantic="TEXCOORD" source="#Tall_bodyShape-UVChannel_1" offset="2" set="0"/> 
       <p> *** lots of numbers *** </p> 
      </triangles> 
     </mesh> 
     <extra> 
      <technique profile="MAYA"> 
       <double_sided>1</double_sided> 
      </technique> 
     </extra> 
    </geometry> 
</library_geometries> 

Ainsi, les vertices sont stockés dans la balise <source> nommée "position", les Normales sont stockés dans la balise <source> nommée "normal" et la balise <triangles> répertorient les coordonnées UV et les normales associées à quel sommet. Je suppose que les triangles sont énumérés dans une méthode de «ligne» ou de «dépouillée», mais cela ne dit pas lequel et quoi que j'essaie, ils affichent tous les deux un désordre de triangles en forme de boule.

Est-ce que quelqu'un sait s'il y a d'autres données de maillage que j'ai manqué dans une autre partie du dae ou dans lesquelles je me suis peut-être trompé? Si nécessaire, je peux afficher la fonction dans laquelle je charge dans les données de maillage.

EDIT: Note supplémentaire: Je suis certain que le fichier .dae est correct et valide car il peut être correctement chargé dans le PhyreEngine (j'utilise un .dae que j'ai utilisé pour un projet universitaire l'année dernière).

+0

Vous devez appliquer les transformations dans la scène. – jterrace

+0

Voulez-vous dire dans la section avec la balise 'library_visual_scenes' qui énumère une charge de choses sur catrig et les os? Le seul autre truc que j'ai pu trouver concernait l'animation. Je pensais que, parce que le modèle 3D est un maillage unique (l'artiste l'a extrudé à partir d'une seule boîte) qu'il serait dans une pose complète, pas de chevauchement, lorsque seulement les verticies sont extraites. – Edward

Répondre

1

Je sais que c'est une question relativement ancienne, mais comme il n'a pas vraiment répondu, je vais prendre une fissure à elle pour la postérité.

Vous avez raison de dire que les positions, normales, etc. sont stockées sous la forme de matrices flottantes dans les éléments <source>. L'élément <p> ("primitive") stocke les indices pour les trois entrées répertoriées immédiatement avant dans l'élément <triangles>. C'est-à-dire que les trois premiers entiers (par exemple "0 0 0") pointent vers les valeurs VERTEX, NORMAL et TEXCOORD (UVChannel) appropriées pour le premier sommet. Le fait que ce soit dans un élément <triangles> indique que chaque ensemble de 3 sommets (9 entiers d'index) décrit un nouveau triangle, donc aucun des index n'est réutilisé. Si la géométrie est configurée pour utiliser des bandes (réutilisation des 2 sommets précédents) ou des ventilateurs (réutilisation des sommets précédents et précédents), l'élément parent sera appelé <tristrips> ou <trifans>, respectivement. Le second ensemble de 3 entiers (par exemple "1 1 1") décrit le deuxième sommet dans le premier triangle, et ainsi de suite.

De plus, comme le souligne @jterrace, les coordonnées géométriques sont internes à l'objet décrit dans la géométrie. Pour placer correctement l'objet dans la scène, vous devez appliquer les transformations appropriées (<translate>, <rotate>, etc.) à la scène, comme décrit dans <library_visual_scenes>.

+0

Je pense que ce ne serait que de 7 entiers et non de 9 car l'uv n'en a que 2 et non 3. – Alex

+0

Ah, oui, vous avez raison, mais je pense que vous voulez dire 8 :) – jared

Questions connexes