[OpenGL] Physique : Moteur de particules

Résolu
cs_keil Messages postés 52 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 25 octobre 2005 - 18 juil. 2005 à 22:02
cs_keil Messages postés 52 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 25 octobre 2005 - 20 juil. 2005 à 22:05
Bonjour,

je veux créer un moteur de particules en opengl, malheureusement il me manque quelques notions de physique.

Pour l'instant j'arrive à émettre des particules selon un vecteur
initial et qui sont soumises à une force de gravité pointant soit vers
vers -y ou y.

Mon souci se pose lorsque je veux créer une sorte de trou noir qui va "aspirer" les particules émises.

Ce trou noir est une sphere et toute particules en dehors de la sphère
ne sont pas affectées contrairement aux particules qui passent à
travers la sphère.
une particule à la périphérie de la sphère sera
moins attirée qu'une particule proche du centre de la sphere. Bien sûr,
une particule au centre même de la sphère ne changera plus de position
jusqu'à sa mort (de la particule).

Ayant déjà mes équations horaires, comment intégré les nouvelles et quelles sont-elles?

Je vous donne mes équations horaires que j'ai déjà:



particle[i].pos.x = particle[i].v0.x*particle[i].livedTime*speed + pos.x;



particle[i].pos.y = particle[i].v0.y*particle[i].livedTime*speed
- 0.5*g*particle[i].livedTime*particle[i].livedTime + pos.y;



particle[i].pos.z = particle[i].v0.z*particle[i].livedTime*speed + pos.z;



g = gravité

v0 = vecteur initial

livedTime = facteur de temps

le reste est assez parlant.



Merci!

3 réponses

cs_keil Messages postés 52 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 25 octobre 2005
20 juil. 2005 à 22:05
Problème résolu (ou bricolé pour certains s'ils veulent!)

Après m'être documenté sur "comment échapper à un trou noir", j'ai
compris qu'il suffisait d'avoir une vitesse supérieur à la vitesse
d'attraction pour s'en évader.

C'était le problème que j'avais avec mes particules.

Donc j'ai fait un test sur la norme du vecteur1 et de celle du vecteur2:

vecteur 1, déplacement de la position de la particule à l'instant Tn-1 jusqu'à la position de la particule à l'instant Tn.

vecteur 2, position de la particule à l'instant Tn vers position du centre du trou noir.

Si la norme du vecteur 1 est supérieur à la norme du vecteur 2, alors
on positionne la particule au centre du trou noir, sinon on applique un
déplacement en fonction des forces présentes. Dans mon cas:

1- poids

2- attraction vers le trou noir (-GmM/r²)



Voilà j'ai maintenant un joli effet de flamme
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
19 juil. 2005 à 17:06
Tu as quel niveau d'étude ?



Tes équations horaires, ca va bien si tu n'as que la gravité. Et encore, ca va bien ... c pas si sur.



Tu peux pas résoudre tes équations comme ca.

Bon voici, comment tu peux faire:

J'utilise une donnée en plus: le temps écoulé depuis le dernier affichage à l'écran. J'appelle ca delta_t.



La tu commences par appliquer le principe fondamental de la dynamique:

particule[i].acc_x = 1/particule[i].masse * ( les forces selon x );

particule[i].acc_y = 1/particule[i].masse * ( les forces selon y );

particule[i].acc_z = 1/particule[i].masse * ( -9.81 * particule[i].masse + les autres forces );



particule[i].speed_x += particule[i].acc_x * delta_t;

particule[i].speed_y += particule[i].acc_y * delta_t;

particule[i].speed_z += particule[i].acc_z * delta_t;



particule[i].pos_x += particule[i].speed_x * delta_t;

particule[i].pos_y += particule[i].speed_y * delta_t;

particule[i].pos_z += particule[i].speed_z * delta_t;



Bon voila, la tu obtiens a peu près la meme chose que toi. Sauf qu'ici
c'est une approximation, donc c'est rigoureusement pas tout a fait
comme toi. Mais tu vas voir c'est bcp plus puissant.



Donc ton trou noir. Bon pour le moment, je vais pas faire ton histoire
de sphère la. Moi je place un trou noir en position X,Y,Z, et qui
exerce sur toutes les particules la forces F= -K/d²; avec K une
constante que tu choisis, essaies 10. Et "d" la distance entre ton trou
noir et la particule en question.



d² = (particule[i].x - X)²+(particule[i].z - Z)²+(particule[i].z - Z)².



Reste a projeter cette force sur les axes x,y,z:

La force est dirigé selon le vecteur trou_noir (O) et particule (M). Le vecteur OM a pour composante:

OM = (particule[i].x - X , particule[i].y - Y, particule[i].z - Z)



On norme ce vecteur:

OM' = ( (particule[i].x - X)/d , (particule[i].y - Y)/d , (particule[i].z - Z)/d)



Voila, maintenant, il faut prendre en compte cette force dans le calcul des positions:

Ce que j'ai mis au début, rien ne change sauf bien sur le principe fondamental de la dynamique:

particule[i].acc_x = 1/particule[i].masse * ( -K/d² * OM'.x ); (composante de OM' selon x)


particule[i].acc_y = 1/particule[i].masse * ( -K/d² * OM'.y );


particule[i].acc_z = 1/particule[i].masse * ( -9.81 * particule[i].masse - K/d² * OM'.z );



Et la toute tes particules seront attirées par le point X,Y,Z.



Seul problème restant, tu inclus du frottement ? car sinon, il vont
tourner autour en éllipse "indéfiniement". F = -K/d², c'est genre force
gravitationnelle. Mais a toi de changer l'expression de la force si tu
veux, c'est pas compliqué. Car j'ai peur de certain bug qui peuvent
arrivé lorsque ta particule arrive trop pres du trou noir. M'enfin
essaies tjs ca. La au moins, tu verras bien tes particules attirées.



Des questions ?



++
0
cs_keil Messages postés 52 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 25 octobre 2005
20 juil. 2005 à 01:56
OK, je vais tester ta solution.

En effet, j'ai ajouté une force à la particule vers le trou noir et ca
fait des bugs quand certaines particules sont trop proches du centre.

Cependant, il y a quelques particules qui se comportent très bien
puisqu'elles sont prises par le trou noir et ne peuvent se dégager du
centre.

je vais voir s'il s'agit d'une erreur de précision en utilisant des double à la place de mes float.

si ca marche, je ne testerai peut être pas ta solution puisque théoriquement elle fonctionne.

En ce qui concerne mon niveau, ca fait 3 ans que j'ai pas fait de
physiques, c'était en Terminale S, avant que je décroche un DUT et une
licence pro en informatique.



Merci de ton aide!
0
Rejoignez-nous