Opengl - simulacia planet

Programovacie jazyky, rady, poradňa...
sharky-no
King
King
Používateľov profilový obrázok
Príspevky: 1681
Registrovaný: 31 okt 2006, 19:53

Opengl - simulacia planet

Príspevok od používateľa sharky-no »

Je to otazka na dobreho fyzikara :)

snazim sa spravit v opengl simulaciu 2 planet s rovnakou hmotnostou. kedze na seba posobia rovnakou silou, mali by v podstate okolo seba len kruzit. lenze nieco mi unika. (neskor by som chcel pridat dalsie objekty s roznymi hmotnostami, avsak na 2 rovnakych sa mi to celkom kontroluje, ci to robim spravne)

Mam strukturu popisujucu planetku

Kód: Vybrať všetko

struct Ball {
        vec3 a;
        float r;
        float m;
        vec3 v;
	vec3 pos;
        float color[3];
};
Mam funkciu na vlozenie, planetky do zoznamu resp. do pola (vektora)

Kód: Vybrať všetko

vector<Ball> balls;
...
addBall() { ...
balls.push_back(b);
}
Ako prve spravim, ze kazdu planete vynulujem zrychlenie, a vsetko sa to odohrava v timeri, cize kazdym cyklom sa prepocitaju nove hodnoty.

Kód: Vybrať všetko

for(int i = 0; i < balls.size(); i++)
	{
                Ball &p = balls[i];
	        p.a =vec3(0,0,0);
	}
A nasleduje problem, ako spravne popisat zmenu drahy planetky. Vychadzam zo vzorcov F = g. m1.m2 / r^2 a F = m.a Vypocitanie aktualneho zrychlenia na planetke robim takto:

Kód: Vybrať všetko

for(int i = 0; i < balls.size(); i++)
        { 
                Ball &p = balls[i];
                for(int j = 0; j < balls.size(); j++)
                {
                        if(j == i) // we consider the 10000 as infinit (big mass) so this particles won't move
                          continue;
						
                        const Ball &p1 = balls[j];
			            float d = sqrt((p1.pos.x - p.pos.x)*(p1.pos.x - p.pos.x) + (p1.pos.z - p.pos.z)*(p1.pos.z - p.pos.z) + (p1.pos.y - p.pos.y)*(p1.pos.y - p.pos.y));
					 
							p.a.x  += (p1.pos.x - p.pos.x)/d * ( p1.m  / (d*d)); //xova zlozka * a
							p.a.y  += (p1.pos.y - p.pos.y)/d * ( p1.m  / (d*d)); //yova zlozka * a
							p.a.z  += (p1.pos.z - p.pos.z)/d * ( p1.m  / (d*d)); //zova zlozka * a
				 
				}
	}	
A koren problemu, zmena suradnic pozicie planetky podla aktualneho zrychlenia, tu som si vedomi chyby, ale netusim ako to uz spravit, celu noc som sa s tym sral a na nic som nedosiel...

Kód: Vybrať všetko

for(int i = 0; i < balls.size(); i++)
        { 	 
              
			  Ball &p = balls[i];
			
			  p.v.x += p.a.x * 10;
			  p.v.y += p.a.y * 10;
			  p.v.z += p.a.z * 10;
			  
			  p.pos.x +=  p.v.x;
			  p.pos.y +=  p.v.y;
			  p.pos.z +=  p.v.z;
 
	 }	
Neviem ci mi tu nechyba nejake dalsie posobenie sil. planetky sa tvaria ze okolo seba osciluju, ale sa k sebe aj priblizia a potom rychlo vzdialia a to sa opakuje stale.. a myslim si, ze by ta vzdialenost medzi nimi by sa nemala menit.

Chyba je hlavne v mojej fyzike, a preto sa potrebujem o nej poradit

//autoeditácia príspevku (13 Jan 2013, 15:02)
momentalne sa to sprava takto
Prílohy
planety.gif
(327.59 KiB) 194 stiahnutí
Aiden
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2213
Registrovaný: 06 apr 2007, 14:28

Re: Opengl - simulacia planet

Príspevok od používateľa Aiden »

Pises, ze na zaciatku vynulujes zrychlenie a to je podla mna prave ten problem, preco planety koliduju. Zaporna dostrediva (normalova) zlozka zrychlenia vyvolava odstredivu silu, kvoli ktorej mozu kruzit (kedze vyrovnava pritazlivu gravitacnu silu) a pokial su planety na zaciatku v pokoji, budu sa k sebe na zaklade Newtonovho grav. zakona pritahovat a pri rovnakej hmotnosti sa akurat zrazia v strede vzdialenosti medzi nimi. Uz od zaciatku by si im mal udelit rychlost. Navyse jednoduhsie by si mal zacat zrejme s dvojicou, kde m1<<m2, nieco ako Mesiac a Zem, kde by si Zem mohol povazovat za staticku a nechat kruzit len mesiac.
Napísať odpoveď