2012-01-26 4 views
3

J'ai des difficultés à charger des informations de données communes à partir du noeud 'animation' du fichier collada.Chargement des joints d'animation Collada?

D'abord, je tente de charger les joints de 'library_visual_scenes':

Les 2 premières articulations ressemblent que:

<visual_scene id="" name=""> 
    <node name="joint1" id="joint1" sid="joint1" type="JOINT"> 
     <translate sid="translate">0.000000 -2.000000 0.000000</translate> 
     <rotate sid="jointOrientZ">0 0 1 90.000000</rotate> 
     <rotate sid="rotateZ">0 0 1 0.000000</rotate> 
     <rotate sid="rotateY">0 1 0 0.000000</rotate> 
     <rotate sid="rotateX">1 0 0 0.000000</rotate> 
     <scale sid="scale">1.000000 1.000000 1.000000</scale> 
     <extra> 
     <node name="joint2" id="joint2" sid="joint2" type="JOINT"> 
      <translate sid="translate">2.000000 0.000000 0.000000</translate> 
      <rotate sid="rotateZ">0 0 1 0.000000</rotate> 
      <rotate sid="rotateY">0 1 0 0.000000</rotate> 
      <rotate sid="rotateX">1 0 0 0.000000</rotate> 
      <scale sid="scale">1.000000 1.000000 1.000000</scale> 
      <extra> 

qui allait bien!

articulations Maya:

http://www.hostingpicture.fr/upload/c3eaf96247e99b90f9087b2d37fb509f.PNG

Mes articulations:

je voudrais mettre une photo, mais comme un nouveau membre, je ne suis pas autorisé. Tu devras me faire confiance sur ce cas, dans mon moteur, les articulations sont au même endroit qu'à la maya. Ensuite, j'essaye de charger les articulations à partir du nœud 'animation'. Voici le problème, je ne peux pas trouver de jointOrient.

<animation id="joint1-anim" name="joint1"> 
<animation> 
    <source id="joint1-translate.Y-output"> 
     <float_array id="joint1-translate.Y-output-array" count="2">-2.000000 -2.000000</float_array> 
<animation> 
    <source id="joint1-rotateZ.ANGLE-output"> 
     <float_array id="joint1-rotateZ.ANGLE-output-array" count="2">0.000000 0.000000</float_array> 

<animation id="joint2-anim" name="joint2"> 
<animation> 
    <source id="joint2-translate.X-output"> 
     <float_array id="joint2-translate.X-output-array" count="2">2.000000 2.000000</float_array> 

Ainsi, après les joints de chargement, ils ressemblent à ce que:

http://www.hostingpicture.fr/image.php?nom=upload/b26b6f8ed80f2bcdb69645d400ac023d.png

Tout le monde ici pourrait aider?

Merci.

(Désolé que je n'ai pas plus de 10 réputations, je ne suis pas autorisé à mettre des photos.)

Répondre

3

J'ai finalement trouvé la réponse, pour ceux qui pourraient être intéressés.

Le noeud visual_scene de collada vous donnera la pose de liaison pour vos articulations. Alors, je vais charger visual_scene coordonnées communes dans une structure:

Quelque chose comme ça:

struct Pose 
{ 
    vec3 translation, 
      orientation, 
      rotation, 
      scale; 
}; 

Pose bind_pose; 

Je vais créer un autre instanciation de struct « Pose », avec un constructeur qui prendre un paramètre font passer pour:

Pose anim_pose(bind_pose); 

Ainsi, après la construction, bind_pose de visual_scene et anim_pose sont les mêmes.

Alors je vais parcourir tout le nœud d'animation dans library_animations, trouver le canal et se intéresser à:

  • les données sources, qui indiquent où trouver des informations sur les animations en commun (« n » float (s) pour "n" animation (s) :))
  • et l'articulation cible.

    <channel source="#joint1-translate.X" target="joint1/translate.X"></channel> 
    

Cela nous dire (et c'est là où j'étais un peu perdu) que nous allons remplacer la valeur ciblée avec la valeur source.Si les données source trouvées dans le nœud de canal sont les mêmes que les données cibles, c.-à-d. :

bind_pose.translation.x a -3,0 comme valeur après le chargement des données de visual_scene et

<source id="joint1-translate.X-output"> 
    <float_array id="joint1-translate.X-output-array" count="1">-3.000000</float_array> 

je ne fais rien.

Si les données source sont différentes des données cibles, je remplace simplement dans anim_pose la bonne valeur.

Et c'est à peu près tout ce que vous avez à faire pour charger correctement les articulations animées de collada.

Si vous voyez quelque chose de mal ici, s'il vous plaît dites-moi.

Espérons que cela aidera.