Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

1

18.02.2005, 18:04

Anziehungskräfte simulieren

Hi Community,

ich habe folgendes Problem:

ich programmiere gerade einen 3D-Elementarteilchensimulator für die Schule, bei dem elektrische oder neutrale Teilchen zusammen mit E- und B-Feldern ein komplexes System bilden, welches durch Differenzialgleichungen viel zu schwierig werden würde, zu berechnen.
Die Darstellung ist kein Problem, ich realisiere die GUI mit MFC und rendere in einem kleinen Fenster über D3D. Das Modell für die Teilchen ist ein X-File.
So, nun das Problem: die Kraft, die zwischen Teilchen wirkt, hängt ja in irgendeiner Weise von einem Abstand ab, bei einem homogenen E- oder B-Feld natürlich nicht, aber bei einem radialen G- oder E-Feld. Ich lassen die Kraft wirken, indem ich die Geschwindigkeit des Teilchen antiproportional zu seiner Masse aber proportional zur vergangenen Zeit verändere. Nun entdecke ich das Phänomen, dass sich zwei Teilchen nähern (immer schneller), sich irgendwann mit hoher Geschwindigkeit treffen aber so schnell "durcheinander durchsausen", dass sie sich erst ewig weit voneinander entfernen (weiter als am Anfang), bevor sie zurückkommen und den gleichen Effekt in noch größerem Ausmaß erleben.
Ich vermute, das liegt daran, dass ich keine unendlich hohe Framerate habe und die Kraft nicht kontinuierlich mit der Zeit wirkt. Wenn das Teilchen also schon gaaaanz nahe am anderen ist (also bei r->0), erfährt es eine unheimlich hohe Kraft, die Geschwindigkeitsvektoren vergrößern sich drastisch und im nächsten Frame, bei dem die Bewegung berechnet wird, ist das Teilchen schon ewig weit weg, sodass nur noch eine kleine Kraft zurück wirkt und das Teilchen ganz langsam nur ausgebremst werden kann.
Ich weiß nicht ob ich richtig liege mit meiner Vermutung, und falls doch, habe ich keine Ahnung, was ich dagegen tun könnte (Kann ich diese lineare interpolation "zwischen" den Frames vielleicht ausgleichen, indem ich die Kraft "quadratisch" zur Zeit anwende? Wie müsste ich es denn dann machen?).

Ich hoffe, einer von euch Genies weiß, was da los ist und kann mir helfen (T-Awards kommen doch bald wieder ;p)!

Danke,
Till
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

unsigned int

Alter Hase

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

2

18.02.2005, 19:18

Hey,

etwas (sehr viel einfacheres) hab ich auch mal vor geraumer Zeit gemacht:
"Sterne" (gerendert als Punkte :D), die sich anziehen...

Das selbe Problem hatte ich auch und auch die selbe Vermutung, aber da das ganze nur ein Fun-Projekt von einem Abend war (also Idee bis Ende), hab ich dann auch recht schnell aufgegeben.

Aber ich denke, dass "unsere" Vermutung stimmt ;) Doch wie gesagt, sorry, eine Lösung hab ich nicht ... !? Aber freue mich auch, wenn jmd anderer eine hat!
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

18.02.2005, 19:33

Was willst Du denn überhaupt bezwecken? Sollen die Teilchen dann kollidieren anstatt aneinander vorbeizufliegen?

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

4

18.02.2005, 19:42

Zitat von »"Steven77"«

Was willst Du denn überhaupt bezwecken? Sollen die Teilchen dann kollidieren anstatt aneinander vorbeizufliegen?


Nein, eine Kollision braucht's im Moment überhaupt nicht! Korrekterweise sollten die Teilchen durcheinander durch fliegen und "pendeln", aber die Teilchen "gewinnen an Energei", was sie nicht tun sollten.
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

5

18.02.2005, 19:48

du könntest die Move Funktion pro Frame mehrmals, aber mit einem konstanten Zeitwert (möglichst klein) aufrufen.

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

18.02.2005, 19:55

...oder Du testest bei jeder Aktualisierung der Positionen, ob zwei Teilchen aneinander vorbeigeflogen sind. Wenn dem so ist, dann sollen die beiden Teilchen die gleiche Entfernung zueinander haben, wie vor dem Vorbeiflug. Dann sind die potenziellen Energien beider Teilchen zueinander die selben, wie vor dem Vorbeiflug und es ist weder Energie dazugekommen, noch abgeflossen.
(Oder vertue ich mich da jetzt?)

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

7

18.02.2005, 20:08

Zitat von »"Steven77"«

...oder Du testest bei jeder Aktualisierung der Positionen, ob zwei Teilchen aneinander vorbeigeflogen sind. Wenn dem so ist, dann sollen die beiden Teilchen die gleiche Entfernung zueinander haben, wie vor dem Vorbeiflug. Dann sind die potenziellen Energien beider Teilchen zueinander die selben, wie vor dem Vorbeiflug und es ist weder Energie dazugekommen, noch abgeflossen.
(Oder vertue ich mich da jetzt?)


Nein, es ist ja eine Simulation, bei der zu jedem Zeitpunkt wirkende Kräfte (und das können 'ne Menge sein!) die Teilchen beeinflussen. Also kann ich nicht "mogeln", indem ich Positionen anpasse.
@Helmut: ahh, das hört sich gut an! Meinst du, ich rufe z.B. hundert Mal Move auf mit dem Hundertstel der vergangenen Zeit? (oder was meinst du mit "konstanter Zeitwert"?) Das könnte ich mal ausprobieren, aber ich hoffe, ich bekomme einen Kompromiss aus Genauigkeit und FPS!
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

18.02.2005, 20:13

Ein Problem dürfte auch die unzureichende Genauigkeit von float und double sein. Es gibt Bibliotheken für "unendlich" genaue Zahlen...

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

9

18.02.2005, 20:32

hmm...seltsam, ich habe es ausprobiert mit 100 Mal Move(fTime/100.0f) aber es tritt exakt das gleiche Phänomen auf: die Teilchen nähern sich ganz normal und kurz vor/bei/nach (?) der Kollision (die ja keine Kollision ist!) sausen sie mit unglaublicher Geschwindigkeit voneinander weg...ich kann dies nur verhindern, wenn ich bei jedem Move prüfe, ob der Abstand nicht zu klein ist, denn dann soll einfach keine Kraft wirken - allerdings ist es dann mathematisch irgendwie unschön und auch ungenau - nach einer gewissen Zeit nähern sich die Partikel dann beim Pendel (wie bei einer Reibung).

Aber ich verstehe nicht, wie andere dieses Problem lösen - ich bin ja wohl nicht der erste, der Anziehungskräfte simuliert. Es gibt doch sicher Physik-Engines mit Gravitation! Wie machen die das???
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

10

18.02.2005, 20:40

Ach so, die Ungenauigkeit von float! Damit dürfte sich wohl auch die "Reibung" erklären lassen...aber mein Gefühl sagt mir, dass für unendlich kleine Abstände der Teilchen man eine unendliche Genauigkeit braucht... :-D

Aber für 10000 Mal Move pro Frame scheint's gut zu funktionieren - machen das so dann auch die Profis (David, du weißt sowas vielleicht am Besten)?
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Werbeanzeige