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:
//---- Dibujamos el mesh
int 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
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.