Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Tanius

Coordinate Relative Joints In Collada

Recommended Posts

Ciao ragazzi, sto scrivendo un loader c++ opengl per modelli collada (v. 1.4.1) e sono in procinto di leggere

lo scheletro. Caricata la struttura delle joints (ho scelto di fare un albero) necessito di renderne le coordinate assolute (tutte le joint in collada, eccetto la radice, hanno coordinate poste come traslazioni e rotazioni rispetto a quelle del padre padre)

posto una parte dello scheletro come esempio:


      <node id="joint1" name="joint1" sid="joint1" type="JOINT">


        <translate sid="translate">-0.01908503 -3.763652 -0.3057548</translate>

        <rotate sid="jointOrientZ">0 0 1 -20.52593</rotate>

        <rotate sid="jointOrientY">0 1 0 0</rotate>

        <rotate sid="jointOrientX">1 0 0 0</rotate>


        <node id="joint2" name="joint2" sid="joint2" type="JOINT">

          <translate sid="translate">0.8095108 0 0</translate>

          <rotate sid="jointOrientZ">0 0 1 -61.76218</rotate>

          <rotate sid="jointOrientY">0 1 0 0</rotate>

          <rotate sid="jointOrientX">1 0 0 0</rotate>

          <rotate sid="rotateZ">0 0 1 0</rotate>

          <rotate sid="rotateY">0 1 0 0</rotate>

          <rotate sid="rotateX">1 0 0 0</rotate>

          <scale sid="scale">1 1 1</scale>


          <node id="joint3" name="joint3" sid="joint3" type="JOINT">

          ...

          </node>


        </node>


      </node>

riporto in seguito il modo in cui calcolo le coordinate (le parti non necessarie sono in pseudocodice):

// n nodo del file necessario alla lettura;

// dad, puntatore alla Joint padre

// la funzione ricorsiva ritorna la radice dell'albero generato dal nodo n


Skeletron* Bone::genera_scheletro_abs (XMLNode n, Skeletron *dad)

{

 // Setto i dati della joint radice non relativi alle coordinate (qui omesso);

 ...

 // fine lettura dei dati non relativi alle coordinate


 // Leggo la traslazione della joint rispetto al padre, se sono presenti

 // (newtree è il puntatore alla nuova radice)


 if(n.nChildNode("translate"))

    sscanf(n.getChildNode("translate").getText(),"%f %f %f",&(newtree->X),&(newtree->Y),&(newtree->Z));                                              

 else

    newtree->X=newtree->Y=newtree->Z=0;


 // Calcolo l'effetto della rotazione del padre sulla traslazione del figlio

 // Rispetto ad X


 newtree->Y =   newtree->Y*(dad->GonioOrient[_X_][COS]) - newtree->Z*(dad->GonioOrient[_X_][SEN]);

 newtree->Z =   newtree->Y*(dad->GonioOrient[_X_][SEN]) + newtree->Z*(dad->GonioOrient[_X_][COS]);


 // Rispetto ad Y

 newtree->X =   newtree->X*(dad->GonioOrient[_Y_][COS]) + newtree->Z*(dad->GonioOrient[_Y_][SEN]);

 newtree->Z = - newtree->X*(dad->GonioOrient[_Y_][SEN]) + newtree->Z*(dad->GonioOrient[_Y_][COS]);


 // Rispetto a Z

 newtree->X =   newtree->X*(dad->GonioOrient[_Z_][COS]) - newtree->Y*(dad->GonioOrient[_Z_][SEN]);

 newtree->Y =   newtree->X*(dad->GonioOrient[_Z_][SEN]) + newtree->Y*(dad->GonioOrient[_Z_][COS]);


 // Traslo rispetto al padre

 newtree->X+=dad->X;

 newtree->Y+=dad->Y; 

 newtree->Z+=dad->Z;  


 // Prendo le rotazioni del nuovo nodo n (serviranno a calcolare le coordiante dei suoi figli)


 if(n.nChildNode("rotate"))

   {

    float f;

    sscanf(n.getChildNode("rotate",0).getText(),"%f %f %f %f",&(f),&(f),&(f),&(newtree->OrientZ));                           

    sscanf(n.getChildNode("rotate",1).getText(),"%f %f %f %f",&(f),&(f),&(f),&(newtree->OrientY));                          

    sscanf(n.getChildNode("rotate",2).getText(),"%f %f %f %f",&(f),&(f),&(f),&(newtree->OrientX)); 

    // Precalcolo Angoli dei Genitori più la loro goniometria

    newtree->OrientZ+=dad->OrientZ;

    newtree->OrientY+=dad->OrientY;

    newtree->OrientX+=dad->OrientX;        

    // Precalcolo seni e coseni

    newtree->GonioOrient[_X_][SEN]=s(newtree->OrientX);     newtree->GonioOrient[_X_][COS]=c(newtree->OrientX);

    newtree->GonioOrient[_Y_][SEN]=s(newtree->OrientY);     newtree->GonioOrient[_Y_][COS]=c(newtree->OrientY);    

    newtree->GonioOrient[_Z_][SEN]=s(newtree->OrientZ);     newtree->GonioOrient[_Z_][COS]=c(newtree->OrientZ);                                

    if(n.nChildNode("rotate")>=4)

      {                             

       // prendo questi angoli, di cui non conosco l'utilità O_O


       sscanf(n.getChildNode("rotate",3).getText(),"%f %f %f %f",&(f),&(f),&(f),&(newtree->AngZ));                           

       sscanf(n.getChildNode("rotate",4).getText(),"%f %f %f %f",&(f),&(f),&(f),&(newtree->AngY));                          

       sscanf(n.getChildNode("rotate",5).getText(),"%f %f %f %f",&(f),&(f),&(f),&(newtree->AngX));   


       // Precalcolo Angoli dei Genitori più la loro goniometria                                               


       newtree->AngZ+=dad->AngZ;

       newtree->AngY+=dad->AngY;

       newtree->AngX+=dad->AngX;                

       newtree->GonioAngle[_X_][SEN]=s(newtree->AngX);     newtree->GonioAngle[_X_][COS]=c(newtree->AngX);

       newtree->GonioAngle[_Y_][SEN]=s(newtree->AngY);     newtree->GonioAngle[_Y_][COS]=c(newtree->AngY);    

       newtree->GonioAngle[_Z_][SEN]=s(newtree->AngZ);     newtree->GonioAngle[_Z_][COS]=c(newtree->AngZ);                                                                  

      }

    else

      newtree->AngX=newtree->AngY=newtree->AngZ=0;

   } 

 else

   {

    newtree->OrientX=newtree->OrientY=newtree->OrientZ=0;                                                  

    newtree->AngX=newtree->AngY=newtree->AngZ=0;                                                  

   }


 // Nel caso c'è un ridimensionamento (ma non nel mio caso, nel mio file son tutti a 1) leggo i valori

 if(n.nChildNode("scale"))

    sscanf(n.getChildNode("scale",0).getText(),"%f %f %f",&(newtree->ScaleX),&(newtree->ScaleY),&(newtree->ScaleZ));                                              

 else

    newtree->ScaleX=newtree->ScaleY=newtree->ScaleZ=1;


 // Gestione delle ricorsioni sui figli (omesse qui)

 ...

 // Fine chiamate ricorsive


 return newtree;

}

Infine, vi allego quello che vedo se provo a visuallizzare lo scheletro caricato secondo questo metodo...

Le specifiche del file Collada 1.4.1 sono fatte prettamente di cacca, ho cercato un po' in rete ma non ho trovato nulla, nessun riferimento, soprattutto in merito alla spiegazione delle coordinate delle joint nel formato collada.

Premetto che esporto il mio modello da maya.

Ora, mi rendo conto che le cause possono essere tante, ma il tutto, secondo me, è capire se sbaglio a interpretare ciò che leggo dal file o se semplicemente è un problema di calcolo mio.

Se qualcuno può aiutarmi gliene sarei eternamente grato... Saluti a tutti.

post-18744-12639195571347_thumb.jpg


Edited by Tanius

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...
Aspetta! x