Wir nutzen Cookies, um das allgemeine Benutzerelebnis zu verbessern. Mit der Nutzung unseres Wikis stimmst du der Nutzung von Cookies zu.

Physik-Engine

Ein Physik-Engine ist ein Programm, das das Verhalten eines Objekts in bestimmten Situationen und unter bestimmten Bedingungen errechnet und dieses möglichst realistisch bewegt. Physik-Engines kommen in vereinfachter Form in den meisten Jump'n'Run-Spielen zum Einsatz, wo sie das Verhalten der Spielfigur berechnen.

Anwendung

Ein Physik-Engine wird benötigt, um zum Beispiel das Verhalten eines Flugzeugs in einer Luftströmung aus einem bestimmten Winkel zu berechnen oder die Schnelligkeit, mit der eine Spielfigur von einer Plattform fällt, zu berechnen. Somit werden Physik-Engines für fast alle Spiele gebraucht, bei denen sich ein Objekt zweidimensional oder mit mehr Dimensionen bewegen kann. Betrachtet man die Zeit auch als Dimension, braucht man für sie keinen zusätzlichen Physik-Engine, da dieser lediglich die Bewegung eines Objekts zu einem anderen beschreibt, wofür zwangsläufig Zeit in Anspruch genommen wird, das heißt, man muss nicht berechnen, wann sich welches Objekt wo befindet, da sich der Physik-Engine nur auf die Berechnung von gegenwärtigen Zuständen beschränkt und nicht in die Zukunft rechnen muss, und da er die Objekte bewegt, führt er dazu, dass sich die Objekte auch in der Zukunft so verhalten, wie sie sollen.

Programmierung

ACHTUNG! Im folgenden Text wird eine teilweise ungenaue oder falsche Vorstellung von Naturgesetzen vermittelt, da er lediglich der Programmierung einer fiktiven Spielwelt dient. Er ist keinesfalls als Artikel über Gravitation und Luftwiderstand zu verstehen oder als Lehrmittel über Physik zu verwenden.

Ein Physik-Engine soll möglichst viele Naturgesetze beachten, um eine sehr realistische Bewegung zeigen zu können. Da man allerdings in den meisten Spielen nicht sehr viele Kräfte beachten braucht, weil eine naturgetreue Nachbildung nicht unbedingt nötig ist, kann man ein Physik-Engine, dessen Berechnungen lediglich auf einer groben Vorstellung von Gravitation (Schwerkraft) basieren, in die meisten Spiele implementieren, ohne ein unrealistisches Ergebnis zu erhalten. Die hier beschriebene Simulation liegt folgenden Annahmen zu Grunde:

  • 1. Ein Objekt muss Energie zum Überwinden der Schwerkraft aufwenden
  • 2. Ein Objekt, das fällt, wird schneller, da es dem massereichen Objekt, das es anzieht, immer näher kommt und so die Gravitation stärker wirkt.

Also müssen wir bewirken, dass sich das Objekt im Laufe des Fallens immer schneller nach unten bewegt, während es beim Springen immer langsamer wird. Wir erstellen nun also eine eigene Variable mit dem Namen "y-Geschwindigkeit", denn sie gibt die Geschwindigkeit auf der y-Achse des Objekts an. Beim Start des Programms steht das Objekt auf dem Boden, kann also nicht weiter nach unten, wir haben infolgedessen eine y-Geschwindigkeit von 0:

 Wenn grüne Flagge angeklickt
 setze [y-Geschwindigkeit v] auf [0]
 

Nun haben wir ein auf dem Boden stehendes Objekt, auf das allerdings noch keine Kräfte wirken. Wir fügen also folgenden Skript hinzu, um die Gravitation zu simulieren:

 Wenn grüne Flagge angeklickt
 wiederhole fortlaufend
 wiederhole bis <wird [Boden v] berührt
 ändere [y-Geschwindigkeit v] um [-1]
 

Nun haben wir eine Schwerkraft, die jedoch noch nicht auf das Objekt wirkt. Dafür müssen wir folgenden Skript programmieren:

 Wenn grüne Flagge angeklickt
 wiederhole fortlaufend
 ändere y um (y-Geschwindigkeit)
 

Nun wirkt die Schwerkraft auf das Objekt, da es seine y-Position immer um die Kraft der Schwerkraft, die auf es wirkt, ändert. Allerdings kann es noch nicht fallen, da es ja immer auf dem Boden steht. Wir fügen also einen Skript hinzu, der das Objekt Kraft aufwenden lässt, die gegen die Gravitation wirkt. Dies geschieht aber nur, wenn die Taste "Pfeil nach oben" gedrückt wird:

 Wenn Taste [Pfeil nach oben v] gedrückt
 setze [y-Geschwindigkeit v] auf [10]
 

Nun haben wir einen Physik-Engine programmiert, der die Schwerkraft beachtet und das Objekt fallen lässt. Du kannst die Zahlen in den Skripten beliebig verändern und ausprobieren, was passiert, denn in einem Spiel kann man auch die Schwerkraft verändern, sie muss nicht der der Erde entsprechen. Um diesen Engine genauer zu machen, können wir auch noch den Luftwiderstand in die Berechnungen einziehen, um die Bewegungen noch realistischer zu machen. Das ist zwar relativ kompliziert, aber möglich. Um das zu programmieren, müssen wir folgendes wissen:

  • 1. Treffen zwei Objekte aufeinander, wird Bewegungsenergie in eine andere Art von Energie umgewandelt, das Objekt verliert also an Geschwindigkeit.
  • 2. Desto größer die Oberfläche eines Körpers, desto größer der ihm entgegengebrachte Luftwiderstand.

Wir brauchen nun also einen Wert, mit dem wir die Oberfläche des Objekts angeben. Wir rechnen in der (fiktiven) Maßeinheit Quadratpixel. Sagen wir, ein Rechteck ist 20 Pixel breit und 50 Pixel lang. Wir rechnen 20 x 50, das ergibt 1000. Wir haben nun also eine Oberfläche von 1000 Quadratpixeln. Wir sagen, dass ein Quadratpixel Luft beim Auftreffen auf ein Objekt dieses um 5% verlangsamt. Da das Objekt dadurch um5% verlangsamt wird, fügen wir folgenden Skript hinzu:

 Wenn grüne Flagge angeklickt
 wiederhole fortlaufend
 falls <<wird [Luft v] berührt> und <(y-Geschwindigkeit)>[0]>>
 ändere [y-Gescwindigkeit v] um (-1)
 

Nun haben wir einen Skript, der eine sehr ungenaue Berechnung von Luftwiderstand bietet. Möchte man diese Berechnungen wirklich in einem Spiel nutzen, sollte man einen Skript, der mathematische Formeln beachtet und genauer ist, benutzen.