ich hab mal ne frage zu Partikelsystemen, bzw deren ablauf...
Jedes Partikel hat eine Position und eine Velocity (Flugrichtung/Geschwindigkeit).
Sagen wir ich emmitiere ein partikel entlang der X-Achse, also ist die Velocity 1|0|0. Damit fliegt das partikel jetzt pro frame eine einheit auf der X-Achse.
Soo.. jetzt will ich eine Gravity á la Erdanziehung darauf wirken lassen.
Bisher habe ich das immer so gemacht, das dass GravityFeld direkt die position vom Partikel verändert, aber das ist ja eigentlich nicht korrekt, oder? Eigentlich dürfte es nur die Velocity ändern, so das das Partikel im bogen nach unten fliegt und dabei beschleunigt.
Nur, wie mach ich das? Ich muß da ja irgendwie die Velocity verändern. Aber.. wie?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde es mit einer normalen Beschleunigungsformel versuchen und da die Gravitationsbeschleunigung einsetzen (auf der Erde 9.81m/s², wenn mich nicht alles täuscht). Die Formel dazu gibts auch im Wiki unter Timebased_Movement:
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my 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
Also die Velocity ist ein Vektor = (1,0,0) und die Gravity = (0,1,0) ebenfalls.
Nun musst du im Grunde nur beide Vektoren addieren, um den resultierenden zu erhalten. Das Gewaehlte Beispiel ist da aber nicht schön ^^ ich nehm mal eni anderes.
Velo = (5,2,4);
Grav = (0,1,0);
dann gilt:
Velo := AddVector(Velo, Grav);
also ist der neue Velo:
Velo = (5,3,4);
Das betrifft jetzt aber mal ganz grundsaetzlich lediglich die Richtung. Man muss ja bedenken, dass da auch noch Geschwindigkeit und Beschleunigung eine Rolle spielen. Ich mache es bei mir zb so, dass ich einen Vektor fuer die Richtung (direction) habe und einen Singlewert fuer die Geschwindigkeit. Das heisst, direction ist ein Normaleneinheitsvektor.
Dann könnte man einfach in jedem Renderprozess einmal die Bewegung fuer die Richtung (direction) und die Geschwindigkeit (Speed) evtl. in Verbindung mit Beschleunigung (Acceleration) ausrechnen und dann eine komplett andere Bewegung für den Fall aus der Richtung des falles (nach unten eben) und der Geschwindigkeit, die sich aus verstreichender Zeit und Erdanziehungskraft errechnet.
So bekommt man einerseits die normale Bewegung des Partikels ohne Erdanziehungskraft und einmal die Bewegung des freien Falls. Zusammenaddiert ergeben beide Vektoren, den resultierenden.
Ja wenn mich nich alles taeuscht, sollte sowas in der Art schon reichen. Wenn Schwerkraft eben ausgeschalten werden soll, dann macht man ein if drum rum oder so oder setzt G auf 0 oder sonstwas.
Hab das leider selber noch nich gemacht, aber an sich sollte das eher eines der kleineren Probleme sein
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Größtenteils kann ich da meinen Vorredern nur zustimmen, muss aber gerade auch noch was loswerden.
Aya hat geschrieben:
Eigentlich dürfte es nur die Velocity ändern, so das das Partikel im bogen nach unten fliegt und dabei beschleunigt. Nur, wie mach ich das? Ich muß da ja irgendwie die Velocity verändern. Aber.. wie?
Was hier schon erwähnt wurde und du wahrscheinlich meinst ist (einfach gesagt) Δv = g*Δt mit v und g als Vektoren, g mit 9.81m/s² zum Erdmittelpunkt gerichtet.
Aber gerade wenn ich das hier lese:
Zitat:
Bisher habe ich das immer so gemacht, das dass GravityFeld direkt die position vom Partikel verändert, aber das ist ja eigentlich nicht korrekt, oder?
Wo du schon von Gravitationsfeldern schreibst, denke ich sofort an die (klassische) newtonsche Mechanik: Ein Körper ändert seine Bewegung nicht, wenn keine Kraft auf ihn wirkt. Die Gravitationskraft berechnet sich als F = γ*(Mm/r²) mit γ = newtonsche Gravitationskonstante, Mm das Produkt der Massen der beiden sich gegenseitig anziehenden Körper und r der Abstand zwischen den Schwerpunkten der beiden Körper. Das Ganze bekommt man auch als Vektor indem man es mit dem Einheitsvektor von einem Schwerpunkt zum anderen multipliziert. Und das kannst du aber auch in die obige Formel einbauen, indem du setzt: g = (γM)/r². M wäre die Masse der Erde und auch g wird wieder zum Vektor wenn man es mit dem Einheitsvektor multipliziert.
Natürlich wirkt die Kraft dann auch auf beide Körper... aber die Erde wird sich so gut wie kaum bewegen im Vergleich zu den Massen die du hast.
Zu beachten ist natürlich, dass das ganze nur für Geschwindigkeiten weit unter der Lichtgeschwindigkeit gilt. Aber ne relativistische Formel ist glaub ich doch eher der Raumkreuzer der auf Amöben schießt.
Also brauch ich zusätzlich zu der Position und Velocity der partikel noch attribute für "Masse" und "Beschleunigung", ja?
@WhiteHunter: Danke für die formlen ^^ aber.. *unsicher guck* ganz durchblicken tu ich da grad nochnicht Wenn ich die 4 Werte "Position", "Velocity", "Mass" und "Acceleration" habe, magst du mir da nochmal kurz sagen welcher Wert welcher teil deiner formeln ist? ^^
Na aus den Massen Deines Partikels und der Erde errechnet sich sowieso nur die Gravitationskonstante g. Da wir wissen, dass die Fallbeschleunigung unabhängig von der Masse des fallenden Objektes ist kannst Du auch die einfachere Variante von Shaddow wählen.
Einfach zu vz g*t addieren, bzw. zu v^ g^*t, falls g^ nicht in Richtung einer Raumachse wirkt.
Falls noch andere Beschleunigungen auf die Partikel wirken (Wind, etc) kannst Du auch alle Beschleunigungsvektoren vor der Multiplikation mit der Zeit addieren.
Die Umständlichere Variante brauchst Du nur, wenn du mit Kräften (F=m*a) arbeitest. Da kann man dann so Späße, wie Luftreibung und so mit einbauen. Oder, falls sich die Beschleunigungskraft abhängig von der Position ändert (Magnetfelder, Punktladungen usw.). Dies ist aber bei normalen Gravistationsberechnungen vernachlässigbar.
[edit]
@WhiteHunter: Bist Du sicher, dass mM das Produkt der Massen ist, und nicht die Summe? Wenn ich 1 kg von m nach M verschiebe, muss die Kraft doch gleich bleiben. Beispiel: m=2;M=1000 -> F=2000*C .. m=1;M=1001 -> F=1001*C Das kann nicht stimmen.
@Aya: Selbst wenn Du mit Kräften arbeitest, kannst Du die Masse weglassen, da sich das m auf dem Weg von F nach v rauskürzt (Trägheit und so). Allerdings nur bei Masseabhängigen Kräften wie g oder Zentrifugal.
[/edit]
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
aber wenn ich einfach nur g*t dazu addiere, dann bekomme ich ja eine "unendliche" beschleunigung, also desto länger das partikel fliegt desto schneller würde es werden.. aber irgendwann hat doch mal alles (aufgrund von luftwiederstand etc) seine maximale geschwindigkeit erreicht..?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Aber so wie ich das sehe, müsste man den Luftwiderstand noch manuell mit einrechnen. Wobei du da schon recht hast, eine Unendliche Beschleuningung solltes da doch eigentlich nicht bei rauskommen, oder?
Naja, und spätestens wenn du die lichtgeschwindigkeit überschreitest solltest du da ne bremse einbauen
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 network • my 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
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Mal ganz langweilig was dazwischen gehauen. Macht es nicht schon fast Sinn eine bestehende Physikengine zu benutzen? Denn wenn ihr schon auf sehr viele Kleinigkeiten Wert legt, dann ist der Schritt zu "Partikel prallen an Gegenständen ab" ja auch nicht mehr wirklich weit.
Mal ganz langweilig was dazwischen gehauen. Macht es nicht schon fast Sinn eine bestehende Physikengine zu benutzen? Denn wenn ihr schon auf sehr viele Kleinigkeiten Wert legt, dann ist der Schritt zu "Partikel prallen an Gegenständen ab" ja auch nicht mehr wirklich weit.
hehe, das ist wahr Und collisionen mit gegenständen sind auch fest eingeplant... nur, ist eine fertige physik engine nicht ein wenig übertrieben dafür? (Da sind ja dann idR. noch hunderte sachen drin die in einer partikel engine niemals verwendet werden würden)
Bzw.. mache ich sowas immer ganz gern zumindest einmal selber um einfach auch zu verstehen wie es funktioniert..
Die Luftreibung ist ja auch nix anderes, als eine geschwindigkeitsquardatabhängige Beschleunigung entgegengesetzt v^. aLuft=|v^|^2*C*-ve^. ve^ist der Einheitsvektor von v^, C ist eine Konstante abhängig von Masse und Volumen des Partikels und Dichte der Athmosphäre (also die eigentliche Reibungskonstante). Addiert man nun aLuft zu allen anderen Beschleunigungen, so kann |v^| nicht unendlich werden. C ist bei einer Feder sehr hoch, bei einer Bleikugel sehr niedrig.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Zitat:
@WhiteHunter: Danke für die formlen ^^ aber.. *unsicher guck* ganz durchblicken tu ich da grad nochnicht Sad Wenn ich die 4 Werte "Position", "Velocity", "Mass" und "Acceleration" habe, magst du mir da nochmal kurz sagen welcher Wert welcher teil deiner formeln ist? ^^
Ich schätze jetzt einfach mal, dass du da keinen Klärungsbedarf mehr hast, da dir g*t ausreichen wird.
Sidorion hat geschrieben:
[edit] @WhiteHunter: Bist Du sicher, dass mM das Produkt der Massen ist, und nicht die Summe? Wenn ich 1 kg von m nach M verschiebe, muss die Kraft doch gleich bleiben. Beispiel: m=2;M=1000 -> F=2000*C .. m=1;M=1001 -> F=1001*C Das kann nicht stimmen.
Netter Gedankengang, aber ein 2kg Körper beschleunigt einen mit 1000kg halt auch nahezu doppelt so stark, wie ein 1kg Körper einen mit 1001kg beschleunigt. Am Beispiel Mond (7,3*10^22kg) und Erde (6*10^24kg) ziehen sich an (385.000km): Ich behaupte F = γ*(Mm/r²) ≈ 1.97 * 10^20 kg*m/s² = N Du behauptest F = γ*((M+m)/r²) ≈ 0.0027 m/s² ... Also entweder erfindest du die Mechanik neu oder wir nehmen die Fassung mit dem Produkt Buch oder Google wird auch eher mich bestätigen.
Zitat:
Die Luftreibung ist ja auch nix anderes, als eine geschwindigkeitsquardatabhängige Beschleunigung entgegengesetzt v^. aLuft=|v^|^2*C*-ve^. ve^ist der Einheitsvektor von v^, C ist eine Konstante abhängig von Masse und Volumen des Partikels und Dichte der Athmosphäre (also die eigentliche Reibungskonstante). Addiert man nun aLuft zu allen anderen Beschleunigungen, so kann |v^| nicht unendlich werden. C ist bei einer Feder sehr hoch, bei einer Bleikugel sehr niedrig.
Irgendwie glaube ich aber doch, dass der Luftwiderstand zusätzlich noch von Anströmfläche und Luftdruck abhängt.
Bislang kenne ich ihn nämlich nur so: F = cw ⋅ A ⋅ ρ/2 ⋅ v², daraus lässt sich die Beschleunigung als a = (cw⋅A⋅ρ⋅v²) / (2*m) herleiten. Sidorion sagte ja schon, diese ist vektoriell gegen die Geschwindigkeitsrichtung gerichtet, muss also mit dem negativen Einheitsvektor der bisherigen Geschwindigkeit multipliziert werden.
cw ist der cw-Wert der sich für komplexe Objekte nur praktisch bestimmen lässt (insbesondere weil der Luftwiderstand eigentlich nicht überall gleich ist). Wikipedia kennt da einige Beispiele. A wie gesagt angeströmte Fläche in m², ρ Luftdruck, bei NB (0°C, Meereshöhe) etwa 101.325 Pa ... was aber auch vom Wetter abhängig ist, etwa 100.000 ist nen guter Wert. m die Masse des beschleunigten Körpers.
Für die Beschleunigung gilt wie gesagt Δv = a*Δt.
Wenn dein Partikel irgendwann nurnoch nach unten fällt, lässt sich daraus durch Umformen auch sagen:
Die maximale Geschwindigkeit ist erreicht, wenn der Luftwiderstand genauso groß ist, wie die Anziehungskraft. Die Momentangeschwindigkeit ist dann:
v = Sqrt(2⋅g⋅m/(cw⋅A⋅ρ))
Danke für die Richtigstellung der Abhängigkeiten der Luftreibung. Physik ist lange her Im Grunde gings mir aber eben um die Abhängigkeit von v^2 und die Wirkrichtung dieser Beschleunigung. Was in C drin ist, ist da nicht soooo entscheidend. Haupsache, die Größenordnung stimmt .
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Insofern ich nicht gerade total aufm schlauch steh sollte der Lufwiderstand nur zur Geschwindigkeit proportional sein (und nicht zum Quadrat). Oder es gab sogar mehrere Fälle wo beides möglich ist... (hab leider gerade das TM Script nicht parat)
Aber wie auch immer, ich würde ein insgesammt stark vereinfachtes Modell benutzen in dem sämtliche Einflüsse des Körpers, also Struktur, Masse, Strömungswiderstand, Form etc. zu einzelnen Konstanten zusammengefaßt werden. Ich würde mich dann auch komplett von irgendwelchen Realistischen Werten lösen und den Konstanten für die einzelnen Körper einfach Werte geben "wie es gerade am besten paßt".
Sind beide Konstanten (Stärke der Quelle und Widerstand des Körpers) brauchbar gewählt ergibt sich das gleichgewicht das der Widerstand die Beschleunigung genau kompensiert von ganz alleine.
Na also da bin ich mir nun absolut sicher, dass die reine Luftreibung proportional zum Quadrat ist. Andere Komponenten, die der Geschwindigkeit entgegenwirken, wie Rollreibung usw sind dagegen nur proportional zu v. Die Luftreibung ist bei geringen Geschwindigkeiten vernachlässigbar gering, macht aber bei hohen Geschwindigkeiten den Hauptanteil aus. Wäre sie proportional zu v, würde sich das Verhältnis zu anderen geschwindigkeitsabhängigen Kräften nicht ändern.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
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.