Aus Linux-Magazin 08/2025

Einsatzgebiete und Grenzen von Physik-Engines

© whitelacephotography / 123RF.com

Pickt ein virtueller Roboter Zahnräder vom Fließband, kollidieren in einem Rennspiel Autos, und rasten Rechtecke magnetisch an Hilfslinien ein, dann arbeitet im Hintergrund häufig eine Physik-Engine. Die Wahl eines Open-Source-Exemplars ist jedoch alles andere als einfach.

Fällt der virtuelle Roboter um, wenn er ein Bein hebt? Werden sich die 3D-gedruckten Kettenglieder ineinander verhaken? Wie erschafft man in einem Zeichenprogramm magnetisch anziehende Objekte und Hilfslinien? Entwickler beantworten solche Fragen mit einem Griff zur Physik. So kleben in einem Diagramm unsichtbare Magnete die Rechtecke aneinander, verknoten leichte Windstöße eine virtuelle Kette und bringen Gewichte den Roboter ins Wanken.

Auf der Suche

Vor allem in grafischen Anwendungen stolpern Programmierer über physikalische Effekte. Dort sollten sich die Elemente so verhalten wie in der realen Welt. Das beginnt bei der korrekten Rotationsgeschwindigkeit der Zeiger einer analogen Uhr und endet mit dem möglichst perfekt simulierten Fahrverhalten eines Autos. Die Berechnung der Geschwindigkeit gelingt dabei vielleicht noch aus dem Kopf (Meter pro Sekunde). Auch die Formel für die Rotationsgeschwindigkeit ist schnell ergoogelt.

Kniffliger wird es bei simulierten Magneten, Kettengliedern und kollidierenden Autos. In solchen Fällen wäre eine Bibliothek mit fertig implementierten Formeln wünschenswert. Die Standardbibliotheken haben das nur selten zu bieten, sodass man zwangsweise auf externe Komponenten ausweichen muss. Die Suche nach solchen Physik-Engines gestaltet sich jedoch erstaunlich kompliziert. Das gilt insbesondere, wenn man auf Open-Source-Exemplare zurückgreifen möchte.

Abbildung 1: Physik-Engines wie Matter.js simulieren Pendel und die korrekte Auswirkung von Stößen.

Abbildung 1: Physik-Engines wie Matter.js simulieren Pendel und die korrekte Auswirkung von Stößen.

Nützlicher Crash

Ob ein per Drag & Drop über den Bildschirm gezogenes Widget mit einem weiteren auf dem Desktop kollidiert oder ein Roboter eine Treppe herunterfällt: Meist sind auf dem Bildschirm irgendwelche Gegenstände im Spiel. Viele Physik-Engines konzentrieren sich daher vor allem auf den Bereich der Mechanik. Das gilt beispielsweise für Matter.js [1], eine der beliebtesten Bibliotheken für Javascript (Abbildung 1). Unter anderem berechnet sie die Auswirkungen von kollidierenden und fallenden Kisten oder die Verformung von Kleidung im Wind. Das Ganze gelingt allerdings bislang nur für 2D-Objekte.

Abbildung 2: Der Vorteil von Javascript: Im Browser lassen sich die Parameter der Beispielprogramme von Matter.js direkt manipulieren.

Abbildung 2: Der Vorteil von Javascript: Im Browser lassen sich die Parameter der Beispielprogramme von Matter.js direkt manipulieren.

Kümmert sich eine Physik-Engine um die physikalisch korrekte Bewegung von harten Gegenständen, spricht man von einer Starrkörpersimulation, englisch: Rigid Body Simulation. Weiche verformbare Körper wie eine Gummiente oder ein Schaumstoffball deckt die Soft Body Simulation ab. Die Kollision, Beschleunigung und Verformung solcher harten und weichen Elemente beherrschen die meisten Physik-Bibliotheken. Eine Flüssigkeitssimulation bieten jedoch nur ausgewählte Exemplare. Auch Matter.js kann keinen Stein in eine Pfütze werfen. Für Berechnungen aus der Optik, Elektronik und anderen Bereichen der Physik müssen Sie grundsätzlich auf entsprechend spezialisierte Bibliotheken ausweichen. Unter Python simulieren beispielsweise die PyOpTools [2] optische Systeme (Abbildung 3), elektronische Schaltungen spielt unter anderem Ngspice [3] durch.

Abbildung 3: Die PyOpTools für Python simulieren Linsen und andere optische Elemente.

Abbildung 3: Die PyOpTools für Python simulieren Linsen und andere optische Elemente.

Spielzeugladen

Einstürzende Gebäude, korrekt von einer Klippe stürzende Gegner und deformierte Motorhauben nach einer Kollision – kaum ein Spiel kommt ohne Physik aus. Es verwundert somit nicht, dass sich viele Physik-Engines explizit für den Einsatz in Videospielen andienen. Für zweidimensionale Spiele gehört dazu Box2d [4], das unter anderem in Angry Birds und Shovel Knight zum Einsatz kam. In 3D-Spielen simuliert Jolt Physics [5] entsprechende Effekte. Bekanntester Einsatzort der Bibliothek dürfte der Shooter Horizon sein. Die in C beziehungsweise C++ implementierten Engines bieten wieder primär eine Rigid Body Simulation.

Abbildung 4: Box2d liegen zahlreiche Beispielprogramme bei. Das hier abgebildete demonstriert sogenannte Joins in Form eines Autolifts.

Abbildung 4: Box2d liegen zahlreiche Beispielprogramme bei. Das hier abgebildete demonstriert sogenannte Joins in Form eines Autolifts.

Prinzipiell lassen sich auf Videospiele zugeschnittene Physik-Engines auch in seriöser Software einsetzen. Viele von ihnen nutzen jedoch Tricks oder Vereinfachungen, um möglichst schnell Ergebnisse liefern zu können. Box2d setzt beispielsweise verschiedene mathematische Näherungsverfahren ein. Die damit nicht mehr ganz exakten Ergebnisse reichen in vielen Fällen jedoch aus. So spielt es keine Rolle, ob zwei Widgets auf dem Desktop pixelgenau kollidiert sind oder sich bereits um ein Pixel überlappen. Falls Sie jedoch für Ihre Anwendung exakte Ergebnisse benötigen, sollten Sie vor dem Einsatz einer Physik-Engine grundsätzlich die zugehörige Dokumentation konsultieren.

Wir sind die Roboter!

Neben Spielen verlangt auch die Robotik eine große Prise Physik. Dort müssen im Rechner simulierte Roboter physikalisch korrekt Gegenstände bewegen oder durch unwegsames Gelände fahren (Stichwort: digitaler Zwilling). Lernt der Roboter per künstlicher Intelligenz selbst laufen, muss man ihm zudem möglichst schnell die Auswirkungen des gehobenen Beins mitteilen. Diese Anwendungsfälle unterstützen einige Physik-Engines explizit.

Abbildung 5: Rapier lässt Objekte auch in 3D kollidieren. Um eine Visualisierung wie hier muss man sich bei den meisten Physik-Engines übrigens selbst kümmern.

Abbildung 5: Rapier lässt Objekte auch in 3D kollidieren. Um eine Visualisierung wie hier muss man sich bei den meisten Physik-Engines übrigens selbst kümmern.

Rapier [6] hält beispielsweise neben der wichtigen Rigid Body Simulation einige weitere Funktionen für die Robotik bereit (Abbildung 5). Unter anderem kann die Library (virtuelle) Charaktere steuern und dabei selbstständig über kleine Hindernisse steigen lassen. Im Gegensatz zu vielen anderen Physik-Engines ist Rapier in modernem Rust implementiert, eine Anbindung besteht zudem an Javascript.

Wer Roboter oder Autos durch eine unebene oder verformbare Landschaft schicken möchte, sollte einen Blick auf ProjectChrono [7] werfen (Abbildung 6). Das C++-Framework lässt sich in Python- und C#-Programme einbinden und simuliert Flüssigkeiten sowie Sensoren von Robotern. Obendrein bietet die Physik-Engine sogar eine Nonlinear Finite Element Analysis (NFEA). Diese Technik hilft beim Deformieren komplexer Gegenstände wie einem Auto bei einem Unfall. ProjectChrono verspricht zudem, die eingangs gestellte Frage nach den sich verhakenden Kettengliedern zu beantworten.

Abbildung 6: ProjectChrono simuliert die Ketten des Fahrzeugs und die weggeräumten Objekte.

Abbildung 6: ProjectChrono simuliert die Ketten des Fahrzeugs und die weggeräumten Objekte.

Harte Beschleuniger

2005 brachte die Firma Ageia eine Erweiterungskarte heraus, auf der ein Chip ausgewählte Physikberechnungen beschleunigen konnte. Über die PhysX-Schnittstelle ließ sich diese Physics Processing Unit (PPU) leicht in eigene Anwendungen einbinden. 2008 übernahm Nvidia das Unternehmen und rüstete die PhysX-Schnittstelle so um, dass auch die Nvidia-Grafikkarten die Berechnungen übernehmen konnten. Mittlerweile hat Nvidia den Quellcode auf Github [19] unter einer BSD-Lizenz offengelegt. Die Bibliothek nutzt C++ und verlangt zur Übersetzung Cmake.

PhysX selbst fokussiert sich auf Rigid- und Soft-Body-Simulationen. Der Schnittstelle zur Seite stehen mit Flow noch eine Flüssigkeits- und Rauchsimulation sowie das Blast SDK, das eine Szene physikalisch korrekt zerstört beziehungsweise explodieren lässt. Ein Einsatzgebiet seiner Physik-Engine sieht Nvidia außer in Spielen heutzutage vor allem in der Simulation sowie der Robotik (Abbildung 7). Da Grafikkarten für die Berechnungen leistungsfähig genug sind, gibt es schon länger keine Nachfolger der Ageia-PPUs mehr.

Abbildung 7: Auch Nvidia denkt bei seiner PhysX-Schnittstelle mittlerweile vor allem an einen Einsatz in der Robotik.

Abbildung 7: Auch Nvidia denkt bei seiner PhysX-Schnittstelle mittlerweile vor allem an einen Einsatz in der Robotik.

Sprachlos

Während sich die rotierenden Zeiger einer Uhr noch recht einfach simulieren lassen, muss der Computer schon beim Stoß einer Billardkugel auf einen Pulk anderer zahlreiche Gleichungen lösen – und das am besten in Echtzeit. Bei der Implementierung bieten sich daher vor allem Programmiersprachen an, die besonders flotten Code erzeugen. Da verwundert es nicht, dass für C und C++ besonders leicht Rigid-Body-Simulationen zu finden sind. Aber auch für das eigentlich nicht als besonders rasant bekannte Javascript existieren überraschend viele Bibliotheken. Neben den bereits erwähnten Matter.js und Rapier gibt es beispielsweise mit Planck.js [8] sogar eine Box2d-Portierung.

Bei vielen anderen Sprachen hat man weniger Glück. Im Fall von Go reduziert sich die Auswahl beispielsweise auf die einfache Physik-Engine Physix-go [9]. Ihr Entwickler rät in der Dokumentation explizit davon ab, sie auf Polygone anzusetzen: Die dazu schon eingebauten Funktionen, etwa zur Kollisionserkennung, würden noch nicht gut genug arbeiten. Neben Physix-go existiert noch das Hep-Projekt [10], in dem Go-Bibliotheken für die Hochenergiephysik und somit ein Teilgebiet der Kernphysik entsteht. Das Physics Package [11] ist wie Physix-go nicht nur stark in seinen Fähigkeiten limitiert, sondern auch noch hoffnungslos veraltet. Dasselbe gilt für Cubez [12] und die Box2D-Portierung [13] auf Go.

Geriatrie

Die langsame Weiterentwicklung ist ein grundlegendes Problem quelloffener Physik-Engines. So stammt die letzte Aktualisierung von Matter.js aus dem Jahr 2024. Die letzte Version der Alternative Toxiclibs.js [14] stammt sogar aus dem Jahr 2016. Mit Bullet3 [15] und der Box2d-Alternative Chipmunk2D [16] hat es zudem zwei besonders beliebte Physik-Engines erwischt: Bullet liegt seit 2020 auf Eis, Chipmunk2D hat seit 2019 keine Aktualisierungen mehr gesehen.

Wenn Sie eine Physik-Engine suchen, achten Sie daher immer auf deren Alter und die Aktivitäten der Entwickler. Auch wenn die zugrunde liegenden Formeln weiterhin gelten, könnten Sie sich über die Bibliotheken Sicherheitslücken in Ihre Software holen. Mitunter fällt die Entscheidung dabei schwer. So erschien die letzte ReactPhysics3D-Version [17] im Oktober 2024. Werfen Sie deshalb für eine Beurteilung zusätzlich einen Blick in die Diskussionen über gemeldete Fehler.

Blähbauch

Zwar konzentrieren sich viele Physik-Engines auf einen ganz bestimmten Anwendungsbereich, dennoch schleppen sie einen Haufen Funktionen mit. Matter.js berechnet beispielsweise nicht nur Kollisionen, sondern offeriert auch Partikeleffekte, selbst wenn das eigene Programm gar keine hübschen Explosionen präsentieren soll.

Mit einer Physik-Engine holen Sie sich folglich eine mehr oder weniger dicke Komponente in die eigene Software, die Sie warten und auf dem aktuellen Stand halten müssen. Des Weiteren müssen Sie die Daten vorab dafür aufbereiten. Im schlimmsten Fall verlangt die Physik-Engine, die komplette virtuelle Welt noch einmal in ihrem Gedächtnis nachzubauen. Diese doppelte Buchführung verschwendet dann nicht nur Hauptspeicher, sondern bläht nebenbei den Programmcode auf.

Physik-Engines greifen massiv auf Vektor- und Matrizenrechnungen zurück und verwenden englische Fachbegriffe. So ist mit Body ein starrer Körper gemeint, den wiederum Joints mit anderen Objekten verbinden – beispielsweise den Ober- mit einem Unterarm. Bei Islands handelt es sich stark vereinfacht gesagt um eine Gruppe von Objekten, die einander beeinflussen. Sie müssen folglich nicht nur Mathematikkenntnisse vorweisen können, sondern sich auch in die Terminologie einarbeiten.

Weniger ist mehr

Vielleicht benötigen Sie aber gar keine komplette Physik-Engine. Wenn Sie nur einen Ball hopsen lassen oder die Zeiger einer analogen Uhr weiterdrehen möchten, sollten Sie die entsprechenden Formeln kurzerhand selbst implementieren. Das gelingt schneller, als sich in eine dicke Bibliothek einzuarbeiten. Die notwendigen Gleichungen liefern Ihre Schulhefte aus dem Physikunterricht. Falls Sie die nicht mehr griffbereit haben, finden Sie im Internet [18] passende Formelsammlungen (Abbildung 8). Alternativ befragen Sie eine in diesem Punkt vertrauenswürdige KI.

Abbildung 8: Klemens Fersch stellt auf seiner Seite eine anschauliche Formelsammlung bereit.

Abbildung 8: Klemens Fersch stellt auf seiner Seite eine anschauliche Formelsammlung bereit.

In vielen Fällen müssen Sie noch nicht einmal den jeweiligen physikalischen Effekt detailliert simulieren. Es genügt schon, wenn es im Zeichenprogramm nur so aussieht, als würden sich die Rechtecke magnetisch anziehen. Physiksimulationen sind sogar manchmal gänzlich überflüssig: Wenn Sie GUI-Elemente gleichmäßig anordnen möchten, müssen Sie die Objekte nicht mit exakt simulierten Metallfedern in ihre Positionen drücken, sondern lediglich den verfügbaren Platz aufteilen.

Physik-Engines spielen immer dann ihre Stärken aus, wenn Sie viele der angebotenen Funktionen nutzen, komplexe Aufgaben lösen oder umfangreiche physikalische Effekte simulieren müssen. Möchten Sie beispielsweise eine Variante des Brettspiels Drop-it implementieren, bei der unterschiedlich geformte Plättchen mit verschiedenen Gewichten physikalisch korrekt ein Brett herunterrutschen, erleichtern Matter.js und Konsorten die Arbeit deutlich (Abbildung 9).

Abbildung 9: Planck.js zeigt hier anschaulich, wie wenig Code mit einer Physik-Engine notwendig ist, um Klötzchen mehrere schiefe Ebenen herunterpurzeln zu lassen.

Abbildung 9: Planck.js zeigt hier anschaulich, wie wenig Code mit einer Physik-Engine notwendig ist, um Klötzchen mehrere schiefe Ebenen herunterpurzeln zu lassen.

Fazit

Bevor Sie zu einer Physik-Engine greifen, prüfen Sie besser zunächst, ob Sie den Effekt nicht kurzerhand selbst implementieren können. Sind die Anforderungen umfangreicher, ermitteln Sie den Bereich, in dem Sie Hilfe benötigen. Kollidieren bei Ihnen beispielsweise Klötze, oder simulieren Sie Flüssigkeiten? Suchen Sie dann nach einer dazu passenden Bibliothek. Achten Sie dabei darauf, dass die Physik-Engine aktiv weiterentwickelt wird und zu Ihren Bedürfnissen passt. Und nehmen Sie sich ausreichend Zeit für eine Einarbeitung. (jlu)

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben