Programación Específica > OpenGL

 tutorial sobre Skinning/Bones

(1/1)

diego.martinez:
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 ---     //---- Dibujamos el meshint nB=E->GetNBones();int nV=E->GetNVertex(); _3D * V=E->GetVertex(); //array de vertices  _3D v; //vertice x,y,z,w double weight;  RenderBone(Bones->Root); //aplico las matrices absolutas de los bones for (int iV=0;iV<nV;iV++){    E->WeightedVertex[iV]=V[iV];    E->WeightedVertex[iV].w=1.0;} for (int b=0;b<E->GetNBones();b++)    {        KngBone * B=E->GetBone(b);        for (int w=0;w<B->GetNWeights();w++)            {                iV=B->GetWeight(w).n;                weight=B->GetWeight(w).w;                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.                  v.x*=weight;  //opero sobre los pesos para saber el verdadero desplazamiento                v.y*=weight;                v.z*=weight;                v.w*=weight;                               //sumo todos los pesos para tener el vertice bien                E->WeightedVertex[iV].x+=v.x;E->WeightedVertex[iV].y+=v.y;E->WeightedVertex[iV].z+=v.z;            }    }  for (ifaces=0;ifaces<nFaces;ifaces++)            {                glBegin(GL_LINE_STRIP);                     // Drawing Using Triangles                                        F=Faces[ifaces];                     _3D va,vb,vc;                     va=E->WeightedVertex[F.a];                              vb=E->WeightedVertex[F.b];                                      vc=E->WeightedVertex[F.c];                                       glVertex3f( va.x, va.y, va.z);                              glVertex3f( vb.x, vb.y, vb.z);                              glVertex3f( vc.x, vc.y, vc.z);                              glVertex3f( va.x, va.y, va.z);                glEnd();            }      
para obtener las matrices absolutas de los bones antes hago una operacion recursiva


--- Código: Text ---  void KngRendererBone::RenderBone(KngBone * B){       B->Absolute=*(B->GetMatrix());  //copio la matriz    if (B->GetParent()!=NULL)            B->Absolute*=B->GetParent()->Absolute; //y la multiplico por la matriz acumulada de su padre             for (int e=0;e<B->GetNChilds();e++)                RenderBone(B->GetChild(e));  //recursiva        }  

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:
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...

BlackWind:
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,

Navegación

[0] Índice de Mensajes

Ir a la versión completa