Ein Programm sollte Eingaben nehmen, sie verarbeiten und Ausgaben geben. Was genau nimmt eine Physik-Engine als Input und liefert als Output?
Ein Programm sollte Eingaben nehmen, sie verarbeiten und Ausgaben geben. Was genau nimmt eine Physik-Engine als Input und liefert als Output?
Antworten:
Eine Physik-Engine ist für die Simulation der Bewegungen und Reaktionen von Objekten verantwortlich, als befänden sie sich unter den Bedingungen der realen Physik (oder ähnlich der realen Physik). Es handelt sich normalerweise nicht um ein eigenständiges Programm, sondern um eine Komponente eines größeren, interessanteren Programms (z. B. eines Spiels).
Die Eingabe für eine Physiksimulation ist im Allgemeinen eine Sammlung von Objekten ("Körpern") mit Eigenschaften (z. B. ob sie starr oder weich sind, ihre Massen, Formen usw.) sowie die Sammlung von Kräften, die auf diese Körper wirken.
Basierend auf dieser Eingabe simuliert die Engine aktualisierte Positionen und Ausrichtungen der Körper und wendet sie an ("gibt sie aus"). Wenn Objekte kollidieren oder sich überlappen, ist dies in der Regel in der Ausgabe eines Simulationsschritts in Form eines Rückrufs enthalten, in den sich der Client-Code einbinden kann, um die spezifische, für die Kollision relevante Gameplay-Logik zu handhaben.
Die Eingabe ist Geschwindigkeit, Masse und Zeit, die Ausgabe ist neue Geschwindigkeiten. Manchmal ist Rotation / Drehimpuls auch eine Eingabe und Ausgabe.
Im Wesentlichen versuchen Physik-Engines, die Auswirkungen von Schwerkraft und Kollision zu simulieren. Für bessere Physik-Engines bedeutet dies, dass sie sowohl permanente als auch temporäre Verformungen von Objekten beinhalten, einschließlich der Aufteilung von Objekten in mehrere Objekte und des Drehimpulses von Objekten. Im Idealfall simulieren sie auch Stress, z. B. wie viele Lastwagen diese Brücke überqueren können, bis sie einstürzt, aber das ist ziemlich selten. Weitere Simulationsvariablen wie der Luftwiderstand würden ebenfalls als Physik-Engine gelten, aber soweit ich weiß, haben es diese noch nicht in irgendein Spiel geschafft.
Die meisten Physik-Engines sind zu einem gewissen Grad spezialisiert und simulieren die Physik bis zu einem Punkt, der für das Spiel erforderlich ist. Physik-Engines für Autospiele unterscheiden sich häufig von Physik-Engines für 3D-Shooter. Und die Physik-Engine eines Golfspiels könnte übermäßige Berechnungen der Wechselwirkungen des Golfballs und der einzelnen Grasblätter haben, während die Handhabung von Hochgeschwindigkeitskollisionen und die Verformung eines Autos (falls es von einem Golfball getroffen wird) völlig fehlen. .
In der Regel wird eine Physik-Engine verwendet, um das Verhalten von Objekten in einem Spiel in Bezug auf ihre Umgebung realistisch zu gestalten, ohne dass für jedes mögliche Szenario spezielle Animationen erstellt werden müssen.
Insbesondere nimmt eine Physik-Engine ein Modell mit einer Reihe von Eigenschaften (Masse, Gelenke usw.) und rendert es gemäß einer Reihe von Parametern im Spiel.
Ein frühes Beispiel hierfür waren Raggdoll-Motoren (z. B. in Unreal), die die Art und Weise modellierten, in der schlaffe Körper Stufen herunterfallen usw.
In der aktuellen Technologie sind Physik-Engines häufig eng in ein allgemeines Game-Deign-Paket integriert, ebenso wie KI, In-Game-UI, Cutscene-Generierung usw.
Man könnte mit Sicherheit argumentieren, dass Physik-Engines bis in die Anfänge des Spieledesigns zurückreichen, z. B. könnte Pong als grobe Physik-Engine betrachtet werden. Der wichtigste Punkt ist jedoch, dass eine Physik-Engine Animationspunkte im laufenden Betrieb auf der Grundlage einer Reihe von Parametern generieren kann, anstatt nur vorgegebene Animationssequenzen aus der Bewegungserfassung oder manuellen Animation zu verwenden.
Wie in anderen Antworten erwähnt, kann in einigen Klassen oder bei Spielen wie dem Fahren oder der Flugsimulation die Physik-Engine von grundlegender Bedeutung für das Spiel sein und als solche die Haupteingabe für die Bildschirmanimation sein. Obwohl der Begriff in der Regel für ein Allzweck-Tool verwendet wird, das auf eine Vielzahl von Situationen angewendet werden kann, ohne dass der Entwickler sehr spezifische Kenntnisse oder Analysen des betreffenden Kontextes benötigt, und nicht für einen aus dem Boden gebauten, sehr spezifischen Simulator für eine bestimmte Anwendung.
Eine Physik-Engine ist für die Simulation der Bewegung von Objekten in "der Welt" verantwortlich (was auch immer das im Kontext der Engine bedeutet). Die meisten Physik-Engines verwenden heutzutage die Newtonsche Mechanik, da sie für die meisten Zwecke relativ einfach zu simulieren und "genau genug" sind, es sei denn, Sie führen eine Weltraumsimulation durch.
Theoretisch würde eine "reine" Physik-Engine drei Eingaben benötigen:
Unter Berücksichtigung der Trägheit und der Kräfte bewegt der Motor die Objekte. Die Ausgabe der Physik-Engine ist einfach der neue Zustand "der Welt" , den das Spiel nach Bedarf auslesen und ändern kann.
In der Praxis sind Physik-Engines nicht unbedingt so "rein" . Objekte müssen erstellt und zerstört werden, und manchmal müssen sie so bewegt werden, wie es die Gesetze der Physik-Engine nicht zulassen. Dies kann manchmal außerhalb des Motors erfolgen, manchmal jedoch auch innerhalb des Motors. Um dies zu erreichen, benötigt der Motor mehr Eingaben. Die drei oben genannten Eingänge decken jedoch die Grundlagen ab.
Nehmen wir zum Beispiel an, Sie müssten einen Charakter in einem Spiel mit einem Joystick bewegen. Wenn Sie keine Physik-Engine verwenden, ist dies ziemlich einfach: Wenn Sie sehen, dass der Benutzer den Joystick bewegt, verschieben Sie das Objekt entsprechend. Mit einer Physik-Engine bewegen Sie das Objekt nicht direkt: Sie üben eine Kraft auf das Objekt aus, die der Richtung entspricht, in die das Objekt bewegt werden soll, und lassen es von der Engine tatsächlich bewegen .
Was ist der Unterschied? Selbst wenn es nichts anderes auf der Welt gibt, ist es unwahrscheinlich, dass sich das Objekt auf die gleiche Weise bewegt, da die Physik-Engine Dinge wie eine realistische Beschleunigung handhabt. Es ist aber auch möglich, dass andere Kräfte gleichzeitig auf das Objekt einwirken, ebenso wie die Trägheit, und dass der Motor alle berücksichtigt . Wenn Sie beispielsweise eine Kraft nach Norden auf das Objekt ausüben, während eine andere Kraft eine Kraft nach Westen ausübt (oder wenn sich das Objekt bereits nach Westen bewegt und nichts die Bewegung verlangsamt), bewegt die Engine das Objekt nach Nordwesten.
Das bringt Ihnen eine Physik-Engine: Sie verfolgt Objekte, deren Positionen und Geschwindigkeiten sowie die auf sie einwirkenden Kräfte. Dank der Gesetze der Mechanik kann es sogar einige Kräfte selbst erzeugen, um automatisch mit Dingen wie Kollisionen, Reibung und Schwerkraft umzugehen, ohne dass Sie, der Spieleentwickler, etwas Besonderes tun müssen.
Eine Physics Engine ist im Grunde ein Simulator von Physikkörpern.
Hiermit können Sie einen Körper (oder mehrere) erstellen und seine physikalischen Eigenschaften wie Masse, Größe, Dichte usw. angeben.
Sie können damit auch die Eigenschaften der physikalischen Welt definieren, in der die Simulation stattfindet (z. B. Schwerkraft).
Schließlich können Sie Kräfte aufbringen oder Verbindungen zwischen Körpern herstellen.
Nachdem Sie all diese Dinge definiert haben, können Sie die Simulation starten und die Physics Engine teilt Ihnen mit, wo sich jeder Körper im nächsten Zeitschritt befindet (der normalerweise dem nächsten Frame in Ihrem Spiel entspricht). Und der nächste und so weiter ...
Sie sehen, wie sich die Sprites auf dem Bildschirm bewegen, weil die Game Engine bei jedem Frame die Physics Engine fragt
Wo ist dieser Körper jetzt?
und die Game Engine aktualisiert die Grafikdarstellung entsprechend.
Normalerweise sehe ich die Physics Engine gerne als Werkzeug, um die physikalischen Gesetze deklarativ anzuwenden .
Anstatt Code zu schreiben, um zu beschreiben, welche Berechnungen durchgeführt werden sollen, um zu bestimmen, wo sich ein Körper im nächsten Zeitschritt befindet, beschreibe ich einfach die Physikwelt, indem ich die Attribute der Körper (und der Physikwelt selbst) setze, und lasse die Physik-Engine antworten diese Frage für mich.