Ich habe mich gefragt, wie Kollisionen in einigen einfachen 3D-Autorennspielen gemacht werden (insbesondere in Spielen wie Outrun 2 / Motoracer).
In klassischen Autorennspielen mit komplexer Umgebung (offene Welt) wird dies vermutlich mit einer Basisbox (für das Auto) durchgeführt, um eine Kollision mit dem Flugzeug (für die Strecke, Gebäude und andere Dinge) zu erreichen. Das Ganze würde mit einigen Begrenzungsrahmen optimiert (so wird in vielen Spielen eine Kollision durchgeführt).
In einem Spiel wie Outrun 2 / Motoracer ist das Gameplay so einfach, dass Entwickler das vielleicht nicht brauchen und alles hätte stark vereinfacht werden können. Für diejenigen, die es nie spielen, ist hier das, was so spezifisch ist:
- Das Auto / Fahrrad ist immer auf der Straße geklebt.
- Die Straße ist immer gleich groß und hat eine sehr einfache Form.
- Die einzige Möglichkeit besteht darin, dieser Straße zu folgen, die Straße nicht zu verlassen oder mit etwas anderem in Kollision zu geraten (außer anderen Autos / Motorrädern, aber das ist uns egal).
- Wenn Sie mit der Straße kollidieren, wird eine sehr einfache Arcade-Kollision ausgeführt (das Auto wird einfach von dieser weggeschoben).
Hier ist, wie ich denke, Kollision (hätte) gemacht werden können:
Die gesamte Strecke könnte als riesige 3D-Bezier-Kurve betrachtet werden. Aus dieser Kurve könnten die Straßenpolygone erzeugt werden (unter Verwendung von aus der Kurve erzeugten vorderen, linken und oberen Vektoren). Mit dieser Methode können auch andere Elemente (wie Häuser, Bäume usw.) platziert und ausgerichtet werden.
Dann, um die Kollisionen zu behandeln (und Auto zu zeichnen):
1) Finden Sie die nächstgelegene Position auf der 3D-Kurve von der aktuellen 3D-Position des Autos. Mit anderen Worten, transformieren Sie die Position des 3D-Autos in die Position der Bezierkurve. Jede 3D-Position auf der Straße kann als Verschiebung entlang der 3D-Kurve ( t
) + seitliche Verschiebung ( d
) betrachtet werden. Überprüfen Sie das Bild unten, wenn es nicht klar ist (dies ist ein 2D-Beispiel, aber dies gilt leicht für 3D).
wenn t = 0 Auto am Anfang des Gleisabschnitts ist, wenn t = 1 Auto am Ende ist. wenn d = -1 oder 1 Auto am Gleisrand ist, wenn d = 0 Auto in der Mitte der Straße ist
2) Richten Sie das Auto mit t
und auf die Straße aus d
(sehr einfach: Für alle t
und d
Werte kann ich eine 3D-Position + Vektoren nach oben / vorne / links erhalten). Das Auto ist jetzt auf der Straße geklebt
3) Überprüfen Sie die seitliche Verschiebung d
des Fahrzeugs. Wenn der Wert zu groß (d > 1)
oder zu niedrig ist (d < -1)
, ist das Auto nicht auf der Strecke. Befestigen Sie es einfach, um das Auto an der richtigen Stelle zu platzieren.
Dies macht auch das 3D-Keulen sehr einfach. Zeichnen Sie einfach die Spur von der aktuellen Fahrzeugposition t
zu t + some_big_enough_value_to_avoid_visible_clipping
.
Oder vielleicht irre ich mich völlig: Es wäre viel schneller und einfacher gewesen, nur die Kollision des Autos (einen Begrenzungsrahmen) und einen sehr vereinfachten Satz von Polygonen zu überprüfen, die die Strecke darstellen (ohne die Gebäude und dergleichen). Die 3D-Welt (und das daraus resultierende Kolisionsmodell) wurde einfach zuvor mit einem Drittanbieter-Tool erstellt (keine 3D-Kurve mehr beim Ausführen des Spiels, nur eine Reihe von Polygonen).
quelle
In meinem OpenGL-Renner habe ich ursprünglich zwei Kreise verwendet, um die Grenzen der Strecke zu definieren, aber es schien mir zu mühsam. Ich benutze nur glReadPixel, um die Pixelfarbe zu lesen. Befindet sich das Auto des Spielers über einem grünen (grasfarbenen) Pixel, ist die Bewegung weiter eingeschränkt. Die Leistung wird kaum beeinflusst.
quelle