Gravitation in C++
Dieser Artikel zeigt wie man Reibung und Gravitation in C++ umsetzt. Dafür verwenden und erweitern wir die im letzten Artikel entwickelte Physik Engine. Mit nur wenig Aufwand können wir den Artikeln Gravitation und Reibung an einer schiefen Ebene beibringen. Unterschiedliche Reibungskonstanten (Materialeigenschaften) liefern unterschiedliches Verhalten.
Gravitation in C++
Eine der meist verwendeten Kräfte in Physik Engines ist die Gravitation und die Reibung. Die Gravitation ist meist konstant als Erdgravitation umgesetzt, außer es handelt sich um SciFi Spiele die mit der Gravitation spielen können. In allen Simulationen und Spielen die realistische Kräfte abbilden wollen ist Reibung auf unterschiedlichen Materialien wichtig. Man denke an Rennspiele und unter schiedliche Untergründe. In diesem Beispiel wurden beide Kräfte der kleinen Physik Engine hinzugefügt und in einem Beispielprojekt eingesetzt.
Implementierung
Der Source Code ist wie immer auf meiner GitHub Seite aufzufinden. Neu hinzugekommen sind einige Konstanten in der globals.h Datei:
- DECAY und MIN_DECAY
die Dämpfung beim Aufprall eines Artikels an der Ebene. Durch die min. und max. Werte entsteht eine Dynamik, Partikel springen unterschiedlich hoch. Das trägt zum Realismus der Simulation bei. - LINE_ANGLE
Winkel in dem eine Ebene eingezeichnet wird. Diese Ebene ist für Partikel undurchdringlich, sie prallen daran ab. Je nach Material ist die Reibung auf dieser Ebene anders. - ICE_KONST und STEEL_KONST
das sind zwei unterschiedliche Reibungskonstanten für die Ebene. Diese kann rau oder sehr glatt sein. Je nachdem rutschen die Partikel wegen der Schwerkraft langsam hinunter.
In der Datei phy_friction ist die neu hinzugekommene Reibungskraft implementiert. Auch diese wird von phy_forcegenerator abgeleitet und beschreibt eine Kraft die auf Partikel der Partikel Engine angewendet werden können. In der Implementierung des Beispiels wurde die Kraft an den relevanten Stellen hinzugefügt. In der App::render() Methode wird nun zusätzlich auch die Ebene als Linie gerendert.
Physik Engine Testprogramm
Dieses Beispiel dient dazu die Konstanten für ein realistisches Verhalten der Partikel zu finden. Über die Materialkonstanten kann man recht gut das Verhalten von echten Materialien nachstellen. Am besten ihr probiert unterschiedliche Konstanten aus und ändert auch die Konstanten anderer Kräfte. Man kann auch Kräfte ausschalten und testen wie sich das Verhalten ändert. Es ist gar nicht so einfach die korrekten Werte für eine realistische Physik zu finden. Oft wirken echte gemessene Zahlen unrealistisch, weshalb in Spielen oft sehr oft diese verändert werden damit diese dynamischer wirken.
Fazit
Damit ist das Thema Physik Engine auch schon wieder abgeschlossen. Im Studiengang hatten wir leider nicht mehr Zeit die eigene Engine weiter zu entwickeln. Stattdessen kann man gut eine fertige Engine verwenden. In der aktuellen Version ist beispielsweise Nvidias PhysX Engine nun Open Source. Solche fertigen Engines bieten fertige Klassen von denen alle Objekte die über Physik verfügen sollen abgeleitet werden können. Da diese Engines Open Source sind macht es kaum Sinn an einer eigenen zu arbeiten. PhysX lagert viele Berechnungen auf die GPU aus. Wer in meinem Beispiel sehr viele Partikel erzeugt wird schnell merken wie schnell man damit die CPU in die Knie zwingt. Physikalische Berechnungen können sehr rechenintensiv werden.
Was denkt ihr darüber? Welche Physik Engines kennt ihr?