• Viernes 19 de Abril de 2024, 16:24

Autor Tema:  tutorial sobre Skinning/Bones  (Leído 1850 veces)

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
tutorial sobre Skinning/Bones
« en: Viernes 17 de Octubre de 2008, 19:27 »
0
Buenas:

estoy haciendo un motor y estoy intentando aplicar skinning a partir de bones (en algunos lugares lo llaman de otra forma) pero es la deformacion de la malla para mover una malla unica por medio de los bones vamos.

La cosa es que aplico este codigo:

Código: Text
  1.  
  2.     //---- Dibujamos el mesh
  3. int nB=E->GetNBones();
  4. int nV=E->GetNVertex();
  5.  
  6. _3D * V=E->GetVertex(); //array de vertices
  7.  
  8.  
  9. _3D v; //vertice x,y,z,w
  10.  
  11. double weight;
  12.  
  13.  
  14. RenderBone(Bones->Root); //aplico las matrices absolutas de los bones
  15.  
  16. for (int iV=0;iV<nV;iV++)
  17. {
  18.     E->WeightedVertex[iV]=V[iV];
  19.     E->WeightedVertex[iV].w=1.0;
  20. }
  21.  
  22. for (int b=0;b<E->GetNBones();b++)
  23.     {
  24.         KngBone * B=E->GetBone(b);
  25.         for (int w=0;w<B->GetNWeights();w++)
  26.             {
  27.                 iV=B->GetWeight(w).n;
  28.                 weight=B->GetWeight(w).w;
  29.                 v=B->Absolute.VectorMatrixMultiply(E->WeightedVertex[iV]); //aqui multiplico la matriz acumulada de todos los bones que afectan  a este bone y la aplico sobre el vertice.
  30.  
  31.                 v.x*=weight;  //opero sobre los pesos para saber el verdadero desplazamiento
  32.                 v.y*=weight;
  33.                 v.z*=weight;
  34.                 v.w*=weight;
  35.  
  36.                               //sumo todos los pesos para tener el vertice bien
  37.                 E->WeightedVertex[iV].x+=v.x;E->WeightedVertex[iV].y+=v.y;E->WeightedVertex[iV].z+=v.z;
  38.             }
  39.     }
  40.  
  41.  
  42. for (ifaces=0;ifaces<nFaces;ifaces++)
  43.             {
  44.                 glBegin(GL_LINE_STRIP);                     // Drawing Using Triangles
  45.                    
  46.                     F=Faces[ifaces];
  47.  
  48.                     _3D va,vb,vc;
  49.  
  50.                     va=E->WeightedVertex[F.a];         
  51.                     vb=E->WeightedVertex[F.b];                 
  52.                     vc=E->WeightedVertex[F.c];                 
  53.  
  54.                     glVertex3f( va.x, va.y, va.z);         
  55.                     glVertex3f( vb.x, vb.y, vb.z);         
  56.                     glVertex3f( vc.x, vc.y, vc.z);         
  57.                     glVertex3f( va.x, va.y, va.z);
  58.                 glEnd();
  59.             }   
  60.  
  61.  
  62.  

para obtener las matrices absolutas de los bones antes hago una operacion recursiva

Código: Text
  1.  
  2.  
  3. void KngRendererBone::RenderBone(KngBone * B)
  4. {   
  5.     B->Absolute=*(B->GetMatrix());  //copio la matriz
  6.     if (B->GetParent()!=NULL)
  7.             B->Absolute*=B->GetParent()->Absolute; //y la multiplico por la matriz acumulada de su padre
  8.  
  9.             for (int e=0;e<B->GetNChilds();e++)
  10.                 RenderBone(B->GetChild(e));  //recursiva       
  11. }
  12.  
  13.  


y la malla se me deforma horriblemente.

no se que hago mal, alguien sabe algun tutorial donde expliquen que operaciones hay que producir para que se deforme bien?

alguien sabe que puedo estar torciendo?


gracias por anticipado, pero buf, tengo el engine parado por esto.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: tutorial sobre Skinning/Bones
« Respuesta #1 en: Domingo 26 de Octubre de 2008, 03:20 »
0
Hola, mira no he leído todo tu post... sólo me he quedado al final con lo de... " //y la multiplico por la matriz acumulada de su padre".
Veamos si obtienes una matriz absoluta, la nueva matriz será la matriz base multiplicada por las transformaciones que se hagan al origen (la matriz absoluta) y por supuesto las multiplicaciones en el orden correcto, de otro modo sale cualquier cosa...
«Ma non troppo»
----> ModoVacaciones = False<----

BlackWind

  • Miembro activo
  • **
  • Mensajes: 89
    • Ver Perfil
Re: tutorial sobre Skinning/Bones
« Respuesta #2 en: Miércoles 29 de Octubre de 2008, 17:07 »
0
en gametutorials.com tienen un buen tutorial de animacion por weighted bones, que es practicamente lo que tu quieres hacer, pero es de paga.

Basicamente, lo que tienes que hacer es aplicar SLERP (spherical linear interpolation) entre la animacion de un hueso y el otro.

Si quieres saber mas sobre slerp, aqui lo explican muy bien:
http://www.euclideanspace.com/maths/alg ... /index.htm

Tambien, en el CG book de nvidia, explican como hacerlo, aqui esta:
http://http.developer.nvidia.com/CgTuto ... ter06.html

Y estoy CASI seguro, que en el sdk de nvidia hablan sobre eso, pero no recuerdo bien.
http://developer.nvidia.com/

saludos,