Usando il formato .x per esportare un modello da Blender, posso caricare una mesh, un'armatura e un'animazione. Non ho problemi a generare la mesh e a visualizzare i modelli nel gioco. Inoltre, ho animazioni e armature correttamente caricate in strutture dati appropriate.
Il mio problema è applicare correttamente l'animazione ai modelli. Ho il framework per applicare i modelli e il codice per selezionare le animazioni e passare da un frame all'altro.
Da quello che ho capito, la AnimationKey
s all'interno AnimationSet
fornisce le trasformazioni per trasformare la posa del legame in posa nella cornice animata. Come piccolo esempio:
Animation {
{Armature_001_Bone}
AnimationKey {
2; //Position
121; //number of frames
0;3; 0.000000, 0.000000, 0.000000;;,
1;3; 0.000000, 0.000000, 0.005524;;,
2;3; 0.000000, 0.000000, 0.022217;;,
...
}
AnimationKey {
0; //Quaternion Rotation
121;
0;4; -0.707107, 0.707107, 0.000000, 0.000000;;,
1;4; -0.697332, 0.697332, 0.015710, 0.015710;;,
2;4; -0.684805, 0.684805, 0.035442, 0.035442;;,
...
}
AnimationKey {
1; //Scale
121;
0;3; 1.000000, 1.000000, 1.000000;;,
1;3; 1.000000, 1.000000, 1.000000;;,
2;3; 1.000000, 1.000000, 1.000000;;,
...
}
}
Quindi, per applicare il fotogramma 2, prenderei la posizione, la rotazione e la scala dal fotogramma 2, creerei una matrice di trasformazione (chiamala Transform_A
) da loro e applicherei quella matrice dai vertici controllati dai Armature_001_Bone
loro pesi. Quindi aggiungerei il TransformA
mio shader e trasformerei il vertice. Qualcosa di simile a:
vertexPos = vertexPos * bones[ int(bfs_BoneIndices.x) ] * bfs_BoneWeights.x;
Dove bfs_BoneIndices
e bfs_BoneWeights
sono valori specifici dell'attuale vertice.
Quando carico i vertici della mesh, li trasformo con il rootTransform
e il meshTransform
. Ciò garantisce che siano orientati e ridimensionati correttamente per visualizzare la posa del legame.
Il problema è quando creo quella matrice di trasformazione (usando la posizione, la rotazione e la scala dall'animazione), non trasforma correttamente il vertice. Probabilmente c'è di più oltre al semplice utilizzo dei dati di animazione. Ho anche provato ad applicare le gerarchie di trasformazione ossea, ancora nessun dado. Fondamentalmente finisco con alcuni modelli contorti. Va anche notato che sto lavorando in openGL, quindi è necessario considerare qualsiasi trasposizione di matrici che potrebbe essere necessario applicare.
Di quali dati ho bisogno e come posso combinarli per applicare animazioni .x ai modelli?
Ho fatto alcuni modelli di come appare, nel caso sia utile.
Per prima cosa volevo solo testare la traduzione, questa è una testa bobbing, come appare in Blender:
http://i.stack.imgur.com/NAc4B.gif
E come appare nel gioco (non importa i colori):
http://i.stack.imgur.com/nj2du.gif
Quindi, solo per la rotazione, l'animazione era la testa che ruotava di 360 gradi attorno all'asse verticale. Ecco come appare nel gioco:
http://i.stack.imgur.com/gVyUW.gif
Nota, non dovrebbe esserci inclinazione, solo rotazione come una giostra.
Aggiornare
Ho la parte di traduzione dell'animazione funzionante. Ma sembra un po 'confuso e non vedo come applicarlo alla rotazione.
La traduzione funziona seguendo questi passaggi:
- Prendi la posizione dal riquadro dell'animazione e scambia i valori
y
ez
- Traduci la matrice di trasformazione in base alla posizione modificata
- Trasponi la matrice di trasformazione
- Applica la matrice di trasformazione ai vertici
Quindi è così che può funzionare, ma come dovrebbe funzionare generalmente per posizione, scala e rotazione?