Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:23

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Partikel mal anders...
BeitragVerfasst: So Mär 07, 2004 14:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Ich hab mich mal hingesetzt und überlegt wie man ein Partikel System möglichst "perfekt" programmiert.
Ich bin zu dem Schluss gekommen das man die Positionen der Partikel nur von der "Gesamtzeit" des Fensters abhängig machen sollte.
Außerdem gibt es keinen Tod für die Partikel...
Die Gesamtzeit wird dann auf eine Art "Zeitfenster" beschränkt.

Ansonsten passieren nämlich ab und zu mal lustige Dinge, wenn man z.B. die Titelleiste lange anklickt und das Fenster hin und herzieht.
Und das ist leicht unschön....

Code:
  1.  
  2. type
  3.  tparticle=packed record
  4.   pos:tvec3; // Position bei t = 0
  5.   velo:tvec3; // Bewegungsvektor bei t = 0
  6.   life:single; // Wert zwischen 0 und 1, wichtig für z.B. Farbverläufe
  7.   respawn:single; // Auch ein Wert zwischen 0 und 1 gibt die Position im "Zeitfenster" an
  8.  end;
  9.  
  10. const
  11.  count=200; // Anzahl der Partikel die angezeigt werden
  12.  
  13. var
  14.  particles:array[0..count-1]of tparticle; // Array für die Partikel
  15.  grav:tvec3; // Globaler Gravitaionsvektor oder sowas
  16.  
  17. procedure initsys; // Initalisierung des Systems
  18. var i:integer;
  19. begin
  20.  for i:=0 to count-1do
  21.  begin
  22.   with particles[i]do
  23.   begin
  24.    pos.x:=0;
  25.    pos.y:=-0.25;
  26.    pos.z:=0;
  27.    velo.x:=0.6-1.2*random;
  28.    velo.y:=2+0.2*random;
  29.    velo.z:=0.6-1.2*random;
  30.    respawn:=i/count;
  31.    life:=0;
  32.   end;
  33.  end;  
  34.  grav.x:=0;
  35.  grav.y:=4;
  36.  grav.z:=0;
  37. end;
  38.  
  39.  


Soviel zum Aufbau des "System"...
Das wohl wichtigste ist die Procedure Update, hier wird die Sache mit dem Zeitfenster geregelt etc...

Code:
  1.  
  2. procedure update(time:int64;max:longword;c1,c2:trgbaf;size:single);
  3. var i,j:integer;
  4. ptime:single;
  5. color:trgbaf;
  6. vec:tvec3;
  7. begin
  8.  setlength(data,segments);
  9.  for i:=0 to count-1do
  10.  begin
  11.   with particles[i]do
  12.   begin
  13.    ptime:=0;
  14.    if(time>max)xor(time<max)then
  15.    begin
  16.     ptime:=(time+respawn*max)-(round(time+respawn*max)div max)*max; // Aus der "Gesamtzeit" (+ der "Respawnposition" des Partikels) ein Zeitfenster machen
  17.    end;
  18.    ptime:=ptime/max; //Einen Wert zwischen 0 und 1 draus machen, hat einfach was....
  19.    life:=1-ptime;
  20.    // Eigentlich nur eine Anwendung des "schrägen Wurfes"
  21.    vec.x:=pos.x+velo.x*ptime-grav.x*ptime*ptime*0.5;
  22.    vec.y:=pos.y+velo.y*ptime-grav.y*ptime*ptime*0.5;
  23.    vec.z:=pos.z+velo.z*ptime-grav.z*ptime*ptime*0.5;
  24.    color:=colorlerp(c1,c2,life);
  25.    glcolor4fv(@color);
  26.    // Partikel an der Position vec mit der Größe size zeichnen ... \\
  27.  end;
  28. end;
  29. ....
  30. ....
  31. ....
  32. procedure gldraw;
  33. begin
  34.  glclearcolor(0,0,0,0);
  35.  glclear(gl_color_buffer_bit or gl_depth_buffer_bit);
  36.  glloadidentity;
  37.  gltranslate(0,0,-2);
  38.  gldepthmask(false);
  39.   update(ctime,1500000,c1,c2,0.0625);
  40.  gldepthmask(false);
  41. end;
  42.  
  43.  


Okay, soviel zur Einführung (vielleicht kanns ja wer gebrauchen, bzw. vielleicht hat es irgendwer verstanden...) ...
Jetzt zu meinem eigentlichen Problem, ich behandele hier nur einzele Partikel unabhängig voneinander, ich würde jetzt aber auch gerne Partikel sich gegenseitig beeinflussen lassen (Gravition etc...) und da komme ich irgendwie nicht weiter.

Ideen?


mfg las


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
www.las.eu.tc


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 07, 2004 18:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
eigentlich sollte da doch nicht so problematisch sein, da du ja nur in der updatefunktion bei den berechnen noch ein paar parameter hinzufügen musst.

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 07, 2004 19:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Naja, das ist nicht ganz so einfach, weil die Partikel sich gegenseitig anziehen sollen......

_________________
www.las.eu.tc


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 07, 2004 19:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Warum gegenseitig anziehen? aber ist ja egal, nimmst den neusten, dann läßte den 2 neusten näher daran ziehen usw. oder ist das eher net so gut?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 08, 2004 00:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Vermutlich macht man sich die Sache unnötig schwerer, wenn man das Partikelsystem auf diese Art und Weise aufbaut, daß die Position eines Partikels vollständig anhand einer Gleichung und nicht iterativ berechnet wird. Dann müßtest du eigentlich alle anderen Partikel, die diesen Partikel beeinflußen mit in die Gleichung aufnehmen. Auch mit festen Zeitschritten kann man das relativ frameratenunabhängig machen, indem man die Partikel anhand der abgelaufenen Zeit bewegt. Bei der Erstellung neuer Partikel kann man ja definieren wieviele Partikel pro Sekunde neu hinzukommen und das dann auch umrechnen. Da ist man dann vermutlich auf herkömmlichere Weise flexibler. Denn die Partikel könnten ja auch vom Level beeinflußt werden. Und das wird man nicht (effizient) in eine Formel packen können, außer man berechent den gesammten Lebensweg eines Partikels in kleinen Schritten für jeden Frame neu, bis u dem Punkt, an dem man ihn zeichnen möchte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 09, 2004 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Nahhhhh, iterativ is net so der Hammer...

_________________
www.las.eu.tc


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 22, 2004 21:57 
Offline
DGL Member

Registriert: Di Mär 16, 2004 22:25
Beiträge: 17
Hi,

wenn sich alle Partikel gegenseitig anziehen sollen kommst du um Iterationen nicht herum, da das analytisch nicht mehr lösbar ist.

Hab so nen Algorithmus für mein Planetenprog gemacht, war ziemlich genau, schnell und gar nicht schwer.

Code:
  1. For i:=1 To pmax Do begin    //jeden Datensatz durchgehen
  2.     If p[i].aktiv Then Begin     //prüfen, ob er aktiv ist        
  3.       p[i].a:=setzero(p[i].a);     // Beschleunigung null setzten
  4.       For k:=1 To pmax Do Begin    // alle anderen körper durchgehen
  5.         If (i<>k) And (p[k].aktiv) Then Begin
  6.           h:=Vektsub(p[k].pos,p[i].pos);          // Richtungsvektor i->k
  7.           abst:=Betrag(h);                            
  8.           If abst>0 Then Begin
  9.             h:=Skalarmult(1/abst,h);             // normieren
  10.             // Gravitationsgesetz (a:=a+G_stern*m/(abst*abst))
  11.             p[i].a:=Vektadd(p[i].a,Skalarmult(Gstern*p[k].m/(abst*abst),h));
  12.           End;
  13.         End;
  14.       End;
  15.      //neuen Ort errechnen (s:=s+v*t+0.5*a*t^2)
  16.       p[i].pos:=Vektadd(Vektadd(p[i].pos,skalarmult(dt,p[i].v)),skalarmult(0.5*dt*dt,p[i].a));        
  17.     // neue Geschwindigleit (v:=v+a*t)
  18.   p[i].v:=Vektadd(p[i].v,Skalarmult(dt,p[i].a));  
  19. End;

Das ist der Code für die einfachere (ungenauere) Version.
bei der genaueren wird aber nur ein zusätzlicher Hilfsort berechnet und dann linear interpoliert.

Gruß Steffen


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]