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

Tonmeister

Frischling

  • »Tonmeister« ist der Autor dieses Themas

Beiträge: 13

Wohnort: Dresden

Beruf: Tonmeister

  • Private Nachricht senden

1

26.03.2020, 10:39

Physikengine -> Inverse Masse

Hi.

Ich bin gerade dabei meine vor Jahren programmierte 2D Physikengine zu optimieren und zu ergänzen.
Eine dieser Optimierungen ist die Umstellung auf inverse Masse um auch unbewegliche Objekte einfach simulieren zu können. Aber genau da hab ich gerade ein kleines Logikproblem.

Kurz zum Verständnis:
Wenn ich ein Objekt erstelle, dann bestimme ich dafür ein Material und aus diesem Material leiten sich dann verschiedene Dinge ab, wie zum Beispiel die Dichte und die daraus resultierende Masse.

Wenn ich also einen Ball (in 2D eher Kreis) aus Plastik und einen aus Stahl simulieren will, dann bekommen die beiden eine unterschiedliche Masse, auch wenn sie gleich groß sind. Ich hab also beispielsweise einen Kreis mit Masse=2 und einen mit Masse=10.
Der mit der größeren Masse fällt schneller und genauso ist es auch gewollt, aber mit der inversen Masse ist es genau anders herum.

Ich rechne also:

Quellcode

1
InverseMasse = 1 / Masse


Das resultiert in:
Kreis 1: InverseMasse = 0.5
Kreis 2: InverseMasse = 0.1

Somit ergibt sich aber, daß der Stahlkreis nun leichter ist als der aus Plastik. Kann mir jemand aufzeigen wo mein Denkfehler liegt oder wie man das am Besten lösen könnte ?


Eine weitere, grundsätzliche, Frage betrifft die unendliche Masse.

Wenn ich

Quellcode

1
InverseMasse = 1 / 0

rechne, dann gibt es natürlich einen Divide-By-Zero-Fehler, was ja auch verständlich ist.

Schreibe ich jetzt aber

Quellcode

1
2
Masse = 0
InverseMasse = 1 / Masse

ist das Ergebnis 1.#INF, obwohl ich ja im Prinzip auch 1 / 0 rechne.

Wieso ist das so ? 8|

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

26.03.2020, 11:23

"Eine dieser Optimierungen ist die Umstellung auf inverse Masse um auch unbewegliche Objekte einfach simulieren zu können." <- Diese Aussage erscheint seltsam. Meinst du damit, dass ein unendlich schweres Objekt damit effektiv eine inverse Masse von 0 hat und man damit einfacherer rechnen kann als mit INF? Wenn man die inverse Masse einsetzt muss man entsprechend auch alle Formeln anpassen. Sprich statt P = v * m dann halt P = v / m^-1 usw. Hilft dir dass ggf schon weiter?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Nox« (26.03.2020, 13:59)


Tonmeister

Frischling

  • »Tonmeister« ist der Autor dieses Themas

Beiträge: 13

Wohnort: Dresden

Beruf: Tonmeister

  • Private Nachricht senden

3

26.03.2020, 11:50

Nicht ganz.
Ein unendlich schweres Objekt hat eine inverse Masse von INF (Infinity). Damit simuliert man Objekte die sich nicht bewegen sollen und auf die keine einwirkende Kraft irgendwelchen Einfluss hat.

Die Anpassung der Formeln habe ich auch bedacht, aber alle Erklärungen die ich dazu gefunden habe, hatten keine Anpassungen. Deswegen bin ich bissl verwirrt wie das ohne funktionieren soll.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Tonmeister« (26.03.2020, 14:51)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

26.03.2020, 13:21

Die Formeln müssen auf jeden Fall angepasst werden. Immer wenn in der Formel "Masse" vorkommt, musst du "1 / inverse Masse" hinschreiben und die Formel vereinfachen. Nun ist es wohl so, dass die Masse meistens im Nenner vorkommt, d. h. letztendlich spart man sich ein paar Divisionen, wenn man mit der inversen Masse rechnet. 1 / (1 / inverse Masse) = inverse Masse

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

26.03.2020, 14:01

Ein unendliches Objekt hat eine Masse von INF (Infinity).

tja und damit geht die inverse Masse gegen 0, was genau meine Aussage war ;) (habe mal die entscheidenen Worte nochmal in fett editiert oben). Vllt gibt es ja irgendein Trick, warum man gewisse Formeln nicht anpassen muss, aber mich würde es ehrlich gesagt wundern, wenn es da eine allg gültige Aussage zu gäbe.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Tonmeister

Frischling

  • »Tonmeister« ist der Autor dieses Themas

Beiträge: 13

Wohnort: Dresden

Beruf: Tonmeister

  • Private Nachricht senden

6

26.03.2020, 14:50

...was genau meine Aussage war ;)

Genau genommen hast Du keine Aussage gemacht, sondern eine Frage gestellt. Nämlich die, ob ich meinte, daß ein unendlich schweres Objekt eine inverse Masse von 0, statt INF hat und ob man damit besser rechnen kann.
Das hatte ich verneint, da die Masse 0 und somit die inverse Masse INF ist. Auch wenn ich nicht verstehe wieso. (Deswegen die zweite Frage.)


Die Formeln müssen auf jeden Fall angepasst werden.

Davon bin ich eigentlich auch ausgegangen, war mir aber nicht ganz sicher.

Ich hab natürlich vorher gesucht ob ich dazu was finde. Ich fand auch einiges, aber nirgendwo waren die Formeln angepasst.
Zum Beispiel hier im Forum in diesem Thread: Entwicklung einer simplen Physik-Engine, Teil 1

Da steht zum Beispiel diese Formel:

Quellcode

1
Vector3 acc = m_ForceAccum * m_InverseMass;


Und da ist nichts angepasst.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

26.03.2020, 15:59

F = m*a <=> F/m = a = F*inv_m ....
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Tonmeister

Frischling

  • »Tonmeister« ist der Autor dieses Themas

Beiträge: 13

Wohnort: Dresden

Beruf: Tonmeister

  • Private Nachricht senden

8

27.03.2020, 04:08

F = m*a <=> F/m = a = F*inv_m ....

Das ist eine normale Formelumstellung. Was willst Du mir also damit sagen ? 8|

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

27.03.2020, 08:11

Er will dir damit sagen, dass die von dir genannte Formel (Vector3 acc = m_ForceAccum * m_InverseMass) bereits für die inverse Masse angepasst ist. Die Formel für normale (nicht inverse) Masse wäre Vector3 acc = m_ForceAccum / m_Mass. Wenn man durch die Masse teilt, muss man die Formel so umstellen, dass man mit der inversen Masse multipliziert, und umgekehrt. Und genau das wurde hier gemacht.

Tonmeister

Frischling

  • »Tonmeister« ist der Autor dieses Themas

Beiträge: 13

Wohnort: Dresden

Beruf: Tonmeister

  • Private Nachricht senden

10

27.03.2020, 08:34

Achso, verstehe. Aber genau so rechne ich ja bei mir auch.

Nochmal kurz zum Verständnis:
Wenn ich mit der inversen Masse multipliziere, dann wird der Stahlkreis weniger von Kräften beeinflusst, als der Plastikkreis. Das ergibt ja auch durchaus Sinn, da er schwerer ist und somit eine größere Kraft nötig ist um ihn zu bewegen.
Soweit ist das alles klar. Aber...und jetzt kommts...was ist mit der Schwerkraft ?

Gehen wir mal davon aus, daß auf die beiden Kreise nur die Schwerkraft wirkt, weil es zu keinerlei Kollisionen kommt.

Dann ist die auf die Kreise wirkende Gesamtkraft rund 9.81 und somit die Beschleunigung a = ~9.81 * InverseMasse.
Aber wenn man das so rechnet, dann ergibt das für den Stahlkreis eine kleinere Beschleunigung als für den Plastikkreis. Er fällt also langsamer als der andere.

Mir ist klar, daß Objekte gleicher Größe und gleicher Form auch gleichschnell fallen, da sie nur vom Luftwiderstand abhängig sind, aber auch das wäre ja nicht das Ergebnis dieser Formel.

Ich bin mir ziemlich sicher, daß es eine ganz einfache Lösung gibt und ich nur zu kompliziert denke. Aber genau deswegen komme ich nicht drauf. :D

Werbeanzeige