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

Aktuelle Zeit: Mi Mai 15, 2024 18:13

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Partikelberechnung - Z-Achse
BeitragVerfasst: Mi Jan 16, 2008 18:27 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Hallo alle zusammen,

ich habe folgendes Problem, für das meine Mathe-Qualitäten bzw. mein 3D - Denkvermögen nicht allzu frisch ist :-)

Also, ich habe eine Partikelengine geschrieben, funktioniert soweit auch prächtig. Aufgebaut ist die folgendermaßen:
Man gibt einen Winkelbereich an (bei mir ist in Ogl 0° auf genau 3:00 Uhr, mit wachsender Gradzahl gehts gegen den Uhrzeigersinn), beispielsweise von 70 - 110° . In Ogl wäre das (jedenfalls bei mir :-) ) so ca. von 1:00 - 11:00, der spitze Winkel dazwischen. Das wäre zum Beispiel ein guter Ausbreitungswinkel für Feuer, bei einem Wasserfall (nach rechts fallend) wäre 320-360° ein passender Winkelbereich (ca 4:00 - 3:00).

Nachdem die Richtung festgelegt ist, wird die Startgeschwindigkeit angegeben, welche keine vektorielle Größe sondern einfach eine Single ist.

Weiterhin gibt es noch die Gravitation.

So in der Schule hab ich die Zerlegung einer Geschwindigkeitskomponente in X -und Y - Richtung gelernt, und das wende ich auch an:

Code:
  1.  
  2. //Angle ist ein zufälliger Winkel aus dem angegb. Winkelbereich
  3. //StartVelocity = Startgeschwindigkeit
  4. //v  = die errechnete Teilgeschwindigkeit
  5. //t = Alter des Partikels
  6.  
  7. //X RICHTUNG
  8. v := StartVelocity*cos(degtorad(Angle));
  9. Position.X := Spawned.X + (v * t);
  10. //Y RICHTUNG
  11. v := StartVelocity*sin(degtorad(Angle));
  12. Position.Y := Spawned.Y + (v * t) + (0.5 * gravity * sqr(t));


So, dass funktioniert prächtig. Nur wenn jetzt die Z-Achse ins Spiel kommt, gehts schief.
Per Zufall bestimme ich jetzt, ob das Teilchen nach vorne fliegt oder in die Tiefe.
Code:
  1. // Z - Richtung
  2. if random(1)+1 = 0 then
  3.   d := -angle
  4. else
  5.   d := angle;
  6. v := StartVelocity*cos(degtorad(d));
  7. Position.Z := Spawned.Z + (v * t);


Allerdings ist nun alles verzerrt, zu sehn in Bild mit Aktivierter Z-Verschiebung.

Wie berechne ich nun die korrekte Z-Verschiebung? Oder sind meine Berechnungen alle komplett falsch?


Dateianhänge:
Dateikommentar: X & Y & Z - Verschiebung, verzerrter Springbrunnen
falsch.JPG [30.62 KiB]
125-mal heruntergeladen
Dateikommentar: Nur X & Y - Verschiebung - So sollte es sein
richtig.JPG [29.55 KiB]
112-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 16, 2008 19:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Also ich habe festgestellt, dass es bei ParticleEngines meist besser ist, die Geschwindikeit, zumindest im Partikel selbst, als Vektor anzugeben. In der Partikelquelle kannst du natürlich weiterhin ein Single nehmen und dann den Richtungsvektor entsprechend mit selbigem multiplizieren.

Das verwenden eines Vektors für die Geschwindigkeit macht das ganze auch ein wenig einfacher, wenn du Kräfte einrechnen willst, die nicht genau auf einer Achse verlaufen.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 16, 2008 19:43 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Ähm...also die einzelnen Partikel haben alle einen Richtungsvektor. Aber gut, dass du das erwähnt. Hab den Code jetzt mal etwas optimiert.
Am Anfang bekommen sie jetzt (erstmal) die X & Y - Geschwindigkeiten zugewiesen, anstatt in der Renderprozedur (was total unnötig wäre, einen konstant bleibenden Wert jedesmal neu zu berechnen)


Code:
  1.  
  2. procedure TEngine.CreateParticles;
  3. begin
  4. {...}
  5.     Velocity.X := StartVelocity * cos(degtorad(Angle));  
  6.     Velocity.Y := StartVelocity * sin(degtorad(Angle));
  7. end;
  8.  


Da X ja konstant bleibt (Windeffekte kommen später) aber Y sich wegen der Gravitation ja ändert, sieht die Render-Procedur jetzt so aus (ohne Z):
Code:
  1.  
  2. //X - Geschwindigkeit ist geradlinig gleichförmig -> Velocity.X bleibt gleich
  3. Position.X := Spawned.X + (Velocity.X * t);
  4. //Y - Geschwindigkeit ist gleichmäßig beschleunigt -> Velocity.Y wird geändert
  5. Velocity.Y := Velocity.Y + (0.5 * gravity * sqr(t));
  6. Position.Y := Spawned.Y + (Velocity.Y * t);
  7.  


Nur löst das mein Problem mit der Z-Geschwindigkeit leider nicht :-(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 18, 2008 14:41 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Also, ich denke nach längerer Suche, dass es mit der perspektivischen Darstellung zusammenhängt.
glOrtho
Wenn ich jetzt glOrtho nutze (weiß allerdings nicht wie ich diesen Befehl verwenden soll), dann würden die Partikel ja alle auf einer Ebene liegen und eine Definition der Z-Bewegung wäre sinnlos.


Wie schalte ich also die pespektivische Darstellung aus, die Verkleinerung der Elemente die nach hinten fliegen aber an????


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 18, 2008 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Flips hat geschrieben:
Wie schalte ich also die pespektivische Darstellung aus, die Verkleinerung der Elemente die nach hinten fliegen aber an????

Ist dir eigentlich bewusst was du da verlangst? :wink:

Stell dir vor du hast ein Gitter das groesser ist als der Bildschirm. Nun bewegst du dieses Gitter nach hinten.

Wie willst du nun das Gitter kleiner machen, ohne das bisher nicht sichtbare Bereiche des Gitters an den Raendern sichtbar werden. Ausserdem ist zu beobachten wie die Gitterlinen scheinbar in die Mitte laufen.

Man hat also eine pespektivische Darstellung.

Edit 1: Habe mir gerade deinen ersten Post durchgelesen. Du fuegst eine z Geschwindigkeit hinzu ohne die Geschwindigkeit in in x und y Richtung entsprechend zu reduzieren.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 20, 2008 15:53 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Zitat:
Edit 1: Habe mir gerade deinen ersten Post durchgelesen. Du fuegst eine z Geschwindigkeit hinzu ohne die Geschwindigkeit in in x und y Richtung entsprechend zu reduzieren.


Wie soll ich die den reduzieren? (Meine jetzt wie ich das mathematisch machen soll)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 20, 2008 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Flips hat geschrieben:
Zitat:
Edit 1: Habe mir gerade deinen ersten Post durchgelesen. Du fuegst eine z Geschwindigkeit hinzu ohne die Geschwindigkeit in in x und y Richtung entsprechend zu reduzieren.


Wie soll ich die den reduzieren? (Meine jetzt wie ich das mathematisch machen soll)



Ausgangspunkt is ein a Vektor (1,0,0) - der Partikel wuerde sich in x Richtung bewegen.

Diesen rotieren wir nun mit dem Winkel alpha um (0,0,1) und erhalten den Vektor b.
Die Rotationsmatrix m1, beschreibt ebendiese Rotation:
Code:
  1.  
  2. cos (alpha)  -sin(alpha)     0
  3. sin (alpha)  cos(alpha)      0
  4. 0               0                   1
  5.  

Wenn wir nun m1 x a rechnen erhalten wir den Vektor b = (cos(alpha), sin(alpha), 0)

Diesen rotieren wir wiederum mit dem Winkel beta um (0,1,0) und erhalten den Vektor c.
Die Rotationsmatrix hierfuer ist::
Code:
  1.  
  2. cos (beta)   0      sin (beta)
  3. 0               1       0
  4. -sin (beta)   0     cos(beta)
  5.  

Wenn wir nun m2 x b rechnen erhalten wir den Vektor c, was dein gesuchter Geschwindigkeits Vektor ist.

Den Endergebnis Vektor c darfst du nun selbst ausrechnen. Im Tutorial_Nachsitzen kannst du nachlesen wie man eine Matrix mit einem Vektor multipliziert. Auch die Rotationsmatrizen die ich dir hier angegeben habe findest du dort.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 21, 2008 15:26 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Ich danke dir für deine ausführliche Antwort.
Mir ist beim Lesen nämlich eine neue Idee gekommen, ich lege den "Einheitskreis" einfach "flach auf den Boden".
Dann habe ich für die Berechnung der einzelnen Geschwindigkeiten nämlich:
Code:
  1.  
  2. Velocity.X := FStartVelocity * cos(degtorad(Angle));
  3. Velocity.Y := FStartVelocity;
  4. Velocity.Z := FStartVelocity * sin(degtorad(Angle));
  5.  

Jetzt wirds halt mit den Winkeln kompliziert, aber dafür find ich sicher auch noch nen weg (kompliziert deswegen, weil 90° jetzt rein optisch wie 80° aussehn).

Weiß nicht ob ihr meine Lösung versteht, aber ich danke euch trotzdem für eure Hilfe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 21, 2008 20:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Bei der Loesung kannst du weder den Streuwinkel der Fountaine steuern, noch starten alle Partikel mit der gleichen Geschwindigkeit.

Diese letzte Schritt den ich dir zum selberrechnen gelassen habe ist wirklich nicht schwer. Es ist wie im Tutorial unter "Anwendung der Matrix auf einen Vektor", nur das du eine 3x3 Matrix auf einen 3 komponentigen Vektor anwendest statt eine 4x4 Matrix auf einen 4 komponentigen Vektor.


Die ersten zwei Zeilen gehen so:
x = cos(beta)*cos(alpha) + 0*sin(alpha) + sin(beta)*0 = cos(alpha)*cos(beta)
y = 0*cos(alpha) + 1*sin(alpha) + 0*0 = sin(alpha)

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 21, 2008 22:44 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Kommt insgesamt
Code:
  1.  
  2. cos (alpha) * cos (beta)
  3. sin(alpha)
  4. cos(alpha) * -sin (beta)
  5.  

raus?
Also wie du diese Matrizen berechnest habe ich jetzt denke ich mal verstanden!
Nur die Implementierung bereitet mir leichtes Kopfzerbrechen.

Code:
  1.  
  2. Velocity.X := FStartVelocity * cos(degtorad(a)) * cos(degtorad(b));
  3. Velocity.Y := FStartVelocity * sin(degtorad(a));
  4. Velocity.Z := FStartVelocity * cos(degtorad(a)) * - sin(degtorad(b));
  5.  


Wenn ich davon ausgehe, dass ich einen Winkel Alpha und Beta angeben muss, um die Richtung der Partikel festzulegen, was genau ist dann Alpha und was Beta?
Denn egal in welchem Bereich (0-360°) ich Alpha / Beta wähle, ich bin mit dem Code nicht in der Lage einen Springbrunnen-artigen verlauf zu definieren!?!

Ps: Bevor ich vergesse, muss dir jetzt schonmal danken, dass du dir soviel Zeit für mich nimmst :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 22, 2008 09:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Wenn beta = 0 ist, erhalten wir fuer die alpha-Werte:
* 0 Grad den Vektor (1,0,0)
* 90 Grad den Vektor: (0,1,0)
* 180 Grad den Vektor (-1,0,0)
* 270 Grad den Vektor (0,-1,0)
* generel erhalten wir fuer 180 bis 360 Grad einen Vektor der nach unten Zeigt, also nicht das was du willst.

Willst du zum Beispiel eine Fountaine die nach oben zeigt und einen Streuwinkel von gamma Grad insgesamt streut so rechnest du:
Code:
  1. final double smallestAlphaInDegree = 90 - gamma/2.0;
  2. // final double greatestAlphaInDegree = 90 + gamma/2.0;
  3. final double alphaInDegree = smallestAlphaInDegree + Math.random() * gamma;



Beta sorgt fuer eine Rotation um die y-Achse (0,1,0). Wenn du fuer beta einen festen Wert einsetzt erhaelst du eine 2D Fountaine mit der gewaehlten Rotation. Waehlst du beta fuer jeden Partikel ein zufaelliges beta zwischen 0 und 360 Grad nutzt, so erhaelst du eine volle Fountaine.

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 22, 2008 16:03 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Super, danke, jetzt funktioniert es so wie es soll und wie ich es will und der User kann sogar selbst wählen ob es 2D oder 3D sein soll 8)
Und ich hab ne Menge über den mathe. Hintergrund gelernt :-)

DANKE!!!!! :mrgreen: :mrgreen: :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.031s | 18 Queries | GZIP : On ]