[OpenGL] Physique : Moteur de particules [Résolu]

cs_keil 52 Messages postés jeudi 22 mai 2003Date d'inscription 25 octobre 2005 Dernière intervention - 18 juil. 2005 à 22:02 - Dernière réponse : cs_keil 52 Messages postés jeudi 22 mai 2003Date d'inscription 25 octobre 2005 Dernière intervention
- 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!
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
cs_keil 52 Messages postés jeudi 22 mai 2003Date d'inscription 25 octobre 2005 Dernière intervention - 20 juil. 2005 à 22:05
3
Merci
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

Merci cs_keil 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de cs_keil
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 19 juil. 2005 à 17:06
0
Merci
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 ?



++
Commenter la réponse de luhtor
cs_keil 52 Messages postés jeudi 22 mai 2003Date d'inscription 25 octobre 2005 Dernière intervention - 20 juil. 2005 à 01:56
0
Merci
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!
Commenter la réponse de cs_keil

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.