Primitive 2D-Physik-Engine: Brauche Starthilfe

Hallo zusammen

Mit etwas Physik-Halbwissen (und einigem Durcheinander) muss ich eine
einfache 2D-Physik-Engine programmieren. Im karth. 2D-Raum befinden
sich zwei drei Körper (theoretisch auch einige hundert), deren
Gestalt durch eine Bitmap beschrieben wird. Daran greifen an
bekannten Punkten Kraftvektoren an, einerseits „interne“ wie z.B.
eine Antriebskraft, andererseits „externe“ wie z.B. die Gewichtskraft
oder die Normalkraft im Berührungspunkt bei Kollision mit einem
anderen Körper. Weiter sind für den Körper Masse, Schwerpunkt und
geometrisches Zentrum (um welches die Bitmap auch rotiert werden
kann) definiert. Die Lage wird durch Ortsvektor (zum geom. Zentr.)
und momentane Drehung (der Bitmap) beschrieben.

Wenn die Zeit zu laufen beginnt sollen sich nun alle Körper
entsprechend der angreifenden Kräfte korrekt verhalten. Am Ende der
Berechnungskette wollte ich dazu die Kinemate (res. Transl.- u.
Rot.geschw.) eines jeden Körpers verwenden. Diese mal Sek. geteilt
durch vorbestimmte FPS-Rate (z.B. 10 Berechnungsdurchgänge) sollte
mir dann die jeweilige Lageveränderung des Körpers ergeben.

Am Anfang wollte ich zuerst die Dyname des Körpers berechnen, aus
welcher dann (irgenwie) die Kinemate gewonnen werden sollte. Auf dem
Weg von der Resultierenden zur Geschwindikeit hätte ich erstmal mit
Newton 2 die Beschleunigung ausgerechnet, aber diese ist ja nicht
gleichförmig, wenn die Kräfte dauernd ändern. Vom Drehmoment zur
Winkelgeschw. über Winkelbeschl. gibt’s noch mehr Fragezeichen, denn
da kommt mir ja das kaum aus der Bitmap berechenbare
Massenträgheitsmoment in die Quere. An Reibungskräfte hab’ ich jetzt
erstmal gar nicht gedacht. Und schon bei der Berechnung des res.
Drehmoments für die Dyname (für die Resultierende mach ich einfach
Vektoraddition) stellt sich die Frage: Bezüglich welcher Achse? Wie
finde ich die momentane Drehachse überhaupt? Ohne Kollision gibt’s ja
keine Lager. Und die Bitmap lässt sich sowieso nur um das Zentrum
drehen; z.B. für eine Rotation um eine Ecke des Körpers wäre
„programmiertechnisch“ also auch Translation nötig…

Kann mich da jemand auf den rechten Weg führen? Jegliche Tipps
(ausser: „lies erst ein Physik-Buch“) willkommen!

Gruss, operator

Hallo,

Am Anfang wollte ich zuerst die Dyname des Körpers berechnen,
aus
welcher dann (irgenwie) die Kinemate gewonnen werden sollte.

Die anfängliche Rotations- und Translationsgeschwindigkeit kannst du nicht aus der Geometrie der Körper ausrechnen. Sie sind gegeben (oder müssen es zumindest sein), da sie notwendig sind um das System vollständig zu beschreiben.

Auf dem
Weg von der Resultierenden zur Geschwindikeit hätte ich
erstmal mit
Newton 2 die Beschleunigung ausgerechnet, aber diese ist ja
nicht
gleichförmig, wenn die Kräfte dauernd ändern.

Du brauchst die Kraft ja nur für den aktuellen Zeitpunkt zu berechnen. Das musst du halt bei jeder Iteration machen.

Vom Drehmoment
zur
Winkelgeschw. über Winkelbeschl. gibt’s noch mehr
Fragezeichen, denn
da kommt mir ja das kaum aus der Bitmap berechenbare
Massenträgheitsmoment in die Quere.

Wie kommt dir das in die Quere? Du musst es halt ausrechnen. Weisst du wie das geht?

An Reibungskräfte hab’ ich
jetzt
erstmal gar nicht gedacht. Und schon bei der Berechnung des
res.
Drehmoments für die Dyname (für die Resultierende mach ich
einfach
Vektoraddition) stellt sich die Frage: Bezüglich welcher
Achse?

Du solltest zu jedem Körper die Koordinaten des Schwerpunktes speichern. Dann machst du alle Rotationen um den Schwerpunkt.

Wie
finde ich die momentane Drehachse überhaupt?

Wie gesagt: Schwerpunkt. r_schwerpunkt = 1/m * Summe über i r_i * m_i
wobei m die Summe aller m_i ist.

Noch ein kleiner Tipp am Rande: wenn du die Wirklichkeit akkurat abbilden willst brauchst du parallele Updates. Damit meine ich dass du dir nicht Körper 1 anschaust, ihn verschiebst, dann Körper 2, ihn verschiebst etc. sondern dass du für alle Körper die neuen Koordinaten ausrechnest und dafür noch die alten Koordinaten der anderen Körper verwendest. Erst wenn du alle berechnest hast ersetzt du die alten Werte durch die neuen.

Grüße,
Moritz

Vielen Dank für die Tipps!

Am Anfang wollte ich zuerst die Dyname des Körpers berechnen,aus
welcher dann (irgenwie) die Kinemate gewonnen werden sollte.

Die anfängliche Rotations- und Translationsgeschwindigkeit
kannst du nicht aus der Geometrie der Körper ausrechnen. Sie
sind gegeben (oder müssen es zumindest sein), da sie notwendig
sind um das System vollständig zu beschreiben.

Mit „am Anfang“ meinte ich am Anfang eines Berechnungsdurchganges
(für ein Frame). Zur Zeit t0 sind Rotations- und
Translationsgeschwindigkeit gleich Null. Dann beginnen Kräfte zu
wirken über die sich dann die Lageveränderung ergeben soll. Ist da
jetzt was unterbestimmt?

Auf dem Weg von der Resultierenden zur Geschwindikeit hätte ich
erstmal mit Newton 2 die Beschleunigung ausgerechnet, aber diese
ist ja nicht gleichförmig, wenn die Kräfte dauernd ändern.

Du brauchst die Kraft ja nur für den aktuellen Zeitpunkt zu
berechnen. Das musst du halt bei jeder Iteration machen.

OK, sagen wir ich hab den Beschleunigungsvektor, dann brauch ich ihn
also nur mal die Zeit seit dem letzten Durchgang zu rechnen und noch
den alten Geschwindigkeitsvektor aus dem letzten Durchgangzu zu
addieren um den aktuellen Geschwindigkeitsvektor zu erhalten?

da kommt mir ja das kaum aus der Bitmap berechenbare
Massenträgheitsmoment in die Quere.

Wie kommt dir das in die Quere? Du musst es halt ausrechnen.
Weisst du wie das geht?

Nein, nur bei primitven Körpern (Volumenintegral). Hier wird der
Körper durch eine Bitmap beschrieben und die inhomogene
Masseverteilung ist dem Programm nicht bekannt. Darum wird ein neuer
Körper vom Benutzer inkl. Schwerpunkt definiert und dessen
Bestimmung ihm selber überlassen (ob nun geometrisch bei homogener
Masseverteilung oder per Schätzung wenn es sich beim Körper um ein
Auto statt um einen Quader handelt). Müsste ich das mit dem
Masseträgheitsmoment dann auch so machen? Keine Ahnung wie ich oder
der Benutzer dass dann abschätzen soll…

Bezüglich welcher Achse?

Wie finde ich die momentane Drehachse überhaupt?

Du solltest zu jedem Körper die Koordinaten des Schwerpunktes
speichern. Dann machst du alle Rotationen um den Schwerpunkt.

Wie gesagt: Schwerpunkt. r_schwerpunkt = 1/m * Summe über i
r_i * m_i wobei m die Summe aller m_i ist.

Super, wenn für eine von den angreifenden Kräften verursachte
Rotation nur die Achse senkrecht durch das „Schwerpunkt-Pixel“ der
Bitmap in Frage kommt sieht’s schon viel einfacher aus. Dann muss ich
nur noch den Rotations-Algorithmus so hinkriegen.

Wenn jemand für das Ganze einen sehr viel einfacheren Ansatz sieht,
nur raus damit! :wink: