y'a deux grands type d'animations:
- soit tu stoques tous les vertexs skinnés à x fps, et tu interpoles avec un lerp la position des vertexs entre deux frame (Quake 1/2)
- soit tu stoques par vertex les bones utilisés et leur poids, et tu blend tout ce petit monde dans un vertex shader, en gros ça te donne un vertex comme ça:
struct BonedVertex
{
float x,y,z,
nx,ny,nz;
....
.... /* u,v, tangente, binormale... */
unsigned char Bones[4];
float Weights[4];
};
et dans le VertexShader, ça donne un truc dans ce goût (synthaxe n'importe quoi à l'arrache):
matrix BoneMatrix[256];
VertexShader( invertex In, outvertex Out)
{
Out.Pos = (In.Pos *BoneMatrix[In.Bones[0]])*In.Weights[0];
Out.Pos += (In.Pos *BoneMatrix[In.Bones[1]])*In.Weights[1];
Out.Pos += (In.Pos *BoneMatrix[In.Bones[2]])*In.Weights[2];
Out.Pos += (In.Pos *BoneMatrix[In.Bones[3]])*In.Weights[3];
....
etc pareil pour tous les autres grandeurs a skinner
}
l'avantage de l'approche skinnée, c'est qu'elle flexible: tu peux faire ce que tu veux avec les bones, passer d'un état keyframé à un état simulé par moteur physique quand Sonic passe sous une voiture
Message édité par bjone le 02-11-2006 à 13:11:30