begin process at 2012 05 30 00:36:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

OpenGL

 > 

[OpenGL] Physique : Moteur de particules


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

[OpenGL] Physique : Moteur de particules

lundi 18 juillet 2005 à 22:02:18 | [OpenGL] Physique : Moteur de particules

keil

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!
mardi 19 juillet 2005 à 17:06:40 | Re : [OpenGL] Physique : Moteur de particules

luhtor

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 ?

++
mercredi 20 juillet 2005 à 01:56:07 | Re : [OpenGL] Physique : Moteur de particules

keil

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!

mercredi 20 juillet 2005 à 22:05:44 | Re : [OpenGL] Physique : Moteur de particules

keil

Réponse acceptée !
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



Cette discussion est classée dans : pos, particules, sphère, particle, livedtime


Répondre à ce message

Sujets en rapport avec ce message

Qui veut gagné 50Frs!!!!!!!!!!!!!! [ par Akil ] Bonjour à tousJe cherche quelqu'un qui sait bien programmer en langage C++ et Vb.J'ai un projet d'éditeur de texte Farsi (Righttoleft)en C++ et je vou help : collisions particules en OpenGL [ par kx2k3 ] je suis en train de plancher sur des particules en ce moment, en openGLje voudrais les faire rebondir sur un plantous les exemples que j'ai trouvés le Comment savoir en win32 (MFC si pos) [ par thebestvinz ] Comment savoir si une modification a été effectuée sur une boite de dialogue avant de continuer? Erreur avec strcpy [ par ROnE91 ] R-OnEBonjour, je n'arrive pas a faire fonctionner cette fonction. J'utilise vc++6, le compilateur ne m'indique pas d'erreur mais il se connaitre la couleur d un pixel sous windows [ par vychnou ] Bonjour a tous!Mon probleme:j ai besoin de connaitre la couleur d un pixel particulier(par exemple celui pointé par la souris ou bien un pixel dont on opengl pos fenetre [ par mat74 ] salut a ts je cherche comment je pourrai avoir la position de la fenetre en opengl . je prog en win32 . merci d'avance @+ pourquoi ca marche pas :'( [ par xboxut ] salut j ai un probleme avec une fonction pour initialiser des particules,pouvez vous me dire pourquoi il ne marche pas et comment le faire marcher#inc Erreur C++ [ par LordBob ] bonjours a tous,je suis en train de faire un programme, mais j'ai un probleme, une ligne de code qui bug, mais je n'arrive pas a savoir pourquoi... je classe [ par ToToL ] Bonjour j'ai un eptit souci de classe. tout d'abor voici mon code source :#include #include #include int InitSDL( void );void Analise( void );int Draw unicode et bianire help!!!! [ par youpiyoyo ] bon j'ai visité cette page d'abord:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_unicode.99_.stream_i.2f.o_in_text_


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales