C++ Physik Engine wenn ichs mal so nennen soll. Planeten Simulation

hell-student

Lieutenant
Registriert
Nov. 2007
Beiträge
671
Hallo Zusammen,

ich programmiere gerade in C++ eine Simulation. Hierbei kann man die Laufbahn selbst frei wählen und der Planet soll dann auf der Bahn entlang laufen. Mit Start-Stop Funktion.

Also die Bahn ist in 4 Teile unterteilt und ist mit 4 Bezierkurven jeweils 6ten Grades realisiert. In den Eckstellen ist stetigkeit gegeben(soll hier nicht thematisiert werden). Mein Problem ist, dass jeder Bahnabschnitt unterschiedlich lang sein kann und ich die Länge nicht einfach so messen kann. Einzigste Methode wäre den Abstand zweier benachbarter Punkte, jedoch sehr aufwendig. Also folgendes:

Ich habe 4 Bezierfunktionen wobei jedes t wie bei Wiki-Artikel im Intervall [0,1] ist. Jetzt soll man die Simulation starten können, wobei die Startposition auf irgendeiner der 4 Teilstrecken sein kann (kann aber auch definiert werden, also z.b auf Teilstrecke 1 immer). Jedoch kann nun die Bahn ja beliebig gewählt werden und daher muss der Startpunkt ja nicht in der Mitte des Abschittes liegen. So nun soll für jeden Teilabschnitt eine Geschwindigkeit angebbar sein. Damit es aber nicht zu Rucklern an den Schnittstellen gibt soll nun auf den Strecken die Geschwindigkeit angepasst werden wenn. Z.b von einem Abschnitt 1 mit Speed 5 m/s auf einen Abschnitt 2 mit 1m/s gewechselt wird, soll hierbei bereits im Abschnitt 1 rechtzeitig bzw genau zum richtigen Zeitpunkt die Geschwindigkeit verringert werden damit man auf dem 2ten Abschnitt mit 1m/s sich bewegt. Also eine dynamische anpassung des Speed. Hierbei ist es aber so, dass natürlich jederzeit die Bahn, also jeweils die 4 einzelnen Bezierkurven angepasst werden können und auch die Simulation gestoppt werden kann. Hierbei ist das Problem dass ich dann nicht weiß auf welchem Abschnitt ich mich befinde.

Hoffe ich konnte es einigermaßen gut erklären. Falls erforderlich mach ich mal paar Skizzen.

mfg

Die normalen physikalischen Formeln wie: s = m/2*a*t² oder v = s/t reichen ja nicht. muss ja von einer Geschwindigkeit auf eine andere Beschleunigen oder verzögern. Zudem kann es ja sein, dass die Strecke im Abschnitt zu klein ist, dass die Geschwindigkeit gar nicht erreicht werden kann.
 
Ich hoffe ich habe dein Problem richtig nachvollzogen:
- Du beschreibst die Bewegung eines Punktes (Planeten) durch 4 stetig verbundene, geschlossene Bezier-Splines.
- Die Maximalgeschwindigkeit des Punktes innerhalb jedes einzelnen Spline soll vorgegeben sein (ich führe mal die Bezeichung v1... v4 für die Geschwindigkeiten auf jedem Spline ein).
- Die Bewegung des Massenpunktes soll stetig und "rund" sein.

Da die Approximation von Planetenkurven durch Bezier-Splines eine ziemlich grobe Sache ist, will ich dir eine ähnlich grobe Lösung vorschlagen:
- Integriere deine Bezierkurven numerisch, also fahr einfach mit einem Testpunkt die Kurve ab und summiere die Abstände von Testpunkt n-1 zu Testpunkt n auf.
Jetzt hast du L1 bis L4, die Längen deiner Bezierkurven.

- Jetzt interpolierst du jeweils zwischen v(n) und v(n+1) in eine Kurve "deiner Wahl", wobei du L(n) bis L(n+1) als Gewichtungsfaktoren verwendest. Lineare Interpolation, oder vielleicht irgendeine Cosinusfunktion... das ist dir überlassen.

Wenn der User die Kurve verändert, musst du die Integration und die Interpolation der Geschwindigkeit neu machen, aber wenn du nicht gerade für irgendein ganz mieses Smartphone programmierst ist das garantiert nicht der Rede wert was die Rechenpower betrifft.

MfG
Alexander

EDIT: Moment... grad nochmal gelesen. "Strecke zu klein"? Geschwindigkeit nicht erreichbar? Wieso? Ich dachte der User kann da quasi Gott spielen und die Plan nach Belieben vorgeben? Gelten da noch irgendwelche physikalischen Bedingungen? Wenn du eine Maximalbeschleunigung für den Punkt vorgeben willst kannst du das ohne weiteres mit der vorgeschlagenen Methode machen.
 
Zuletzt bearbeitet: (letzter punkt vergessen)
Ich würde das nicht so lösen. Wie du richtig erkannt hast, sind deine Formeln aus physikalischer Sicht nicht vollständig. Das Stichworte lauten "Newtonsches Gravitationsgesetz" und "Keplersche Gesetze".

Du benötigst noch die Kraft zwischen Planet und Stern:

F_Gravitation = G*m_1 * m_2 / r^2

G ist eine Konstante, m_1 und m_2 sind die Massen und r der Abstand. Deine Planetenbahn erhälst du durch schrittweises iterieren für kleine Zeiten t:

F = m*a = m * dv/dt = m * dx^2 / dt^2 = F_Gravitation

dv/dt ist die 1. Ableitung der Geschwindigkeit und dx^2 / dt^2 ist die zweite Ableitung nach dem Ort. Diese Ableitungen bekommst du aus den schrittweisen Iterationen.
In deiner Simulationen benutzt du für jedes Objekt am besten einen Orts- und Geschwindigkeitsvektor, und aktualisierst diese in jedem Iterationsschritt mit den oben genannten Formeln -> fertig :p
 

Ähnliche Themen

Zurück
Oben