1

yop,

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 ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

2

Je pense que tu t'embètes pour rien en fait, parce que maintenant (la riva 128 le faisait déjà c'est dire) toutes les cartes supportent les points étendus, extension EXT_point_parameters.
Les points n'ayant pas d'orientation tu élimines complètement le problème.

3

En fait je viens d'aller vérifier....c'est tellement supporté que c'est même plus une extension, ça a été intégré dans OpenGL 1.4

4

erf ok, et en admettant que ce truc n'existe pas, y'a quand même une solution au problème ? ça m'énerve de ne pas comprendre ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

Ben en fait ce que tu cherches à faire s'appelle du billboarding.

Habituellement la rotation que tu calcules permet d'amener ton dessin dans le plan normal au vecteur (position objet - position caméra)
Si tu veux un truc qui marche dans tous les cas, tu te tappes le calcul pour chaque point de toutes façons, vu que chaque point a une position différente (si tu le fais pas, un point proche de la caméra et légèrement sur le côté sera tout distordu).

6

C'est pas faux, mais ça ne répond pas non plus à la question ^^
(en fait même si ça ne sert à rien, tant qu'à avoir reflechi au problème j'aurais bien aimé aller au bout, tant pis si c'est une mauvaise solution).

au fait, elle s'appelle comment la fonction qui gère ça depuis opengl 1.4 ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

-

8

super interessant ... et la version qui réponde à la question, je suppose que t'as pas ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

9

bon juste pr dire que j'ai trouvé, d'ailleurs vu l'erreur j'ai honte (indice : elle est ds le bout de code que j'ai posté ... hehe), donc poste pas la solution ici grin
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

10

Je pense pas qu'il soit possible de faire mieux que ta version en push pop rotate en fait.

" au fait, elle s'appelle comment la fonction qui gère ça depuis opengl 1.4 ?"
glPointParameterf[v]

11

oki merci
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)