J'ai encore un petit problème en opengl, pour ceux qui l'ont déjà utilisé : je voudrais faire un moteur de particules (un truc basique, le pb n'est pas là), bicause il risque de servir ds quelques projets à venir, donc il faudrait qu'il soit assez génerique.
Le problème est au niveau de l'affichage des particules, je voudrais qu'elle soient tjrs face à l'écran (normal quoi, puisque ce sont des sprites), et quelles que soient les rotations qui aient été faites avant l'appel à la fonction d'affichage. Une des solutions serait d'annuler les rotations en effectuant les rotations inverses avant d'afficher les groupes de particules, mais il serait impossible de "tourner" autour de l'explosion (je ne sais pas trop comment expliquer ça, en gros on verrait toujours l'explosion sous le même angle, elle tournerait en même temps que toutes ses particules pour faire face à l'écran) : c'est mauvais. La deuxième solution, c'est d'annuler les rotations de la même façon, mais avant d'afficher chaque particule et non pas avant la boucle d'affichage des particules : ça marche, mais pour une explosion qui aurait 2000 particules ça fait 2000 glPush/glPop, et 2000 * n glRotatef, donc c'est mauvais aussi.
Du coup j'ai preferé annuler les rotations avant d'afficher les groupes de particules (c'était la 1ere solution) mais recalculer les coordonnées de chaque particule comme si les rotations n'avaient pas été modifiées (ça ne fait que quelques multiplications par des variables qui ne changent pas pendant toute la boucle d'affichage). Pour résumer, voilà à quoi ressemble l'affichage (de tête, j'ai pas le code sous les yeux donc il y a pê qq erreurs) :
glPushMatrix(); glGetFloatv(GL_MODELVIEW_MATRIX, matrix); // récuperation de la matrice courante d'opengl get_rotation(matrix, rotate); // sauvegarde la sous-matrice 3x3 qui correspond à la rotation courante dans "rotate" reset_rotation(matrix); // annule la rotation dans "matrix" en fixant la sous-matrice 3x3 à l'identité for (i = 0; i < nb_particules; ++i) { x = particule[i].x * rotation[0] + particule[i].y * rotation[1] + particule[i].z * rotation[2] + rotation[3]; y = particule[i].x * rotation[4] + particule[i].y * rotation[5] + particule[i].z * rotation[6] + rotation[7]; z = particule[i].x * rotation[8] + particule[i].y * rotation[9] + particule[i].z * rotation[10] + rotation[11]; affiche_particule(x, y, z); } glPopMatrix();
J'aurais pensé que ça suffisait, mais non; tout est affiché correctement à une exception : les particules s'affichent face à l'écran, les rotations sont effectuées, mais dans le sens inverse de ce qu'il aurait fallu. En gros si les rotations effectuées avant l'appel à la fonction étaient "glRotatef(90, 1, 0, 0); glRotatef(90, 0 , 1, 0); glRotatef(90, 0 , 0, 1);", celles recalculées "à la main" seront l'équivalent de "glRotatef(90, 0 , 0, 1); glRotatef(90, 0 , 1, 0); glRotatef(90, 1 , 0, 0);".
Quelqun saurait d'ou vient le problème ?