On souhaite maintenant utiliser l'idée de la partie 1 pour animer un personnage complet.
Par exemple : le modèle
bigguy (nvidia SDK).
|
|
t= 8, Image
8 de l'animation
|
t= 10, Image
10 de l'animation |
Chargez les maillages à deux instants assez
éloignés (bigguy_00.obj et bigguy_10.obj, par exemple) et
écrivez une fonction d'affichage capable d'interpoler la
position de chaque sommet du maillage en fonction du temps.
remarque : objtoy fournit les fonctions nécessaires :
[Documentation et exemple]
model_vbo_clean (dans model_clean)
model_set_vertex_norm (dans model)
Avez-vous des remarques sur la qualité de
l'interpolation ? Quels peuvent être les problèmes ?
Comment les régler ?
Vous aurez sans doute besoin de
SDL_GetTicks (cf. SDL_PG) pour
vous repérer dans le temps (cette fonction renvoie le temps en
millisecondes depuis le début de l'éxécution du
programme).
Chargez tous les maillages et reconstruisez
l'animation complète.
Exemple : parcours des sommets d'un model
FACE *face;
float *normale;
float *sommet;
float *tex;
int i, n;
/* nombre de faces du modele */
n= model_get_faces_n(model);
for(i= 0; i < n; i++)
{
/* obtenir un pointeur sur la face i */
face= model_get_face_ptr(model, i);
/* obtenir le nombre de sommets qui composent la face */
if(face_get_vertex_n(face)==3)
{
/* la face est un triangle
*/
/* récupérer la normale de la face */
normale= model_face_get_norm_ptr(model, face);
/* récupérer les coordonnéees des 3 sommets */
sommet= model_face_get_vertex_ptr(model, face, 0);
/* recuperer la normale du sommet */
normale= model_face_get_vertex_norm_ptr(model, face, 0);
/*
récupérer les coordonnées de texture du sommet */
tex= model_face_get_vertex_texcoord_ptr(model, face, 0);
sommet= model_face_get_vertex_ptr(model, face, 1);
sommet= model_face_get_vertex_ptr(model, face, 2);
}
else if(face_get_vertex_n(face)==4)
{
/* la face est un quad
*/
/* récupérer les coordonnéees des 4 sommets */
sommet= model_face_get_vertex_ptr(model, face, 0);
sommet= model_face_get_vertex_ptr(model, face, 1);
sommet= model_face_get_vertex_ptr(model, face, 2);
sommet= model_face_get_vertex_ptr(model, face, 3);
...
}
}