Wie werden Kollisionen in sehr einfachen 3D-Rennspielen behandelt?

9

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).

Geben Sie hier die Bildbeschreibung ein

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 tund auf die Straße aus d(sehr einfach: Für alle tund dWerte 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 ddes 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 tzu 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).

Tigrou
quelle

Antworten:

16

Ich habe an einigen kommerziellen Spielen gearbeitet, die denen ähneln, die Sie beschreiben.

In jedem dieser Spiele hatten wir tatsächlich Polygone, die eine unsichtbare "Wand" entlang der Seiten der Strecke erzeugten, und führten traditionelle Kollisionstests gegen diese Wände durch. Dies bedeutete, dass wir am Straßenrand, innerhalb der unsichtbaren Wände, einige zusätzliche kollidierbare Gefahren haben und die Straßenbreite schneller variieren können, als Sie es normalerweise mit einem Spline-Ansatz können.

Vor diesem Hintergrund haben wir auch das getan, was Sie im Abschnitt " Wie Kollisionen funktionieren " aufgeführt haben, um Kollisionstunneln / Störungen vorzubeugen. Dieses System wurde auch häufig für die KI-Logik im Rennsport verwendet. Wir haben es auch verwendet, um festzustellen, welche Autos an der Spitze standen, damit wir eine Anzeige "1st / 2nd / 3rd / etc" auf dem HUD anzeigen konnten. Manchmal wurden diese Daten auch zum Wiederauftauchen eines Autos nach einem schweren Unfall verwendet.

Ein Teil, den Sie verpasst haben, wie ich denke, dass eine Kollision funktionieren würde, ist, dass Sie bei der Arbeit mit solchen Splines normalerweise die Splines- Rippen geben. Rippen sind Datenbits, die ausdrücken, wie weit sich die Spur in jeder Richtung vom Spline seitlich erstreckt. Für einen Spline mit einer Länge von 100 Metern haben Sie möglicherweise 50 Rippen, die die Spurbreite alle zwei Meter entlang ihrer Länge angeben. Auf diese Weise kann Ihre Spur die Breite entlang ihrer Ausdehnung ändern. In den Spielen, an denen ich gearbeitet habe, haben diese Rippen auch zwischen "Fahrbahnoberfläche" und "befahrbarem Bereich" unterschieden. Sie hätten also eine Reihe von Straßenbreiten, die angeben, wie weit von der Mitte des Splines entfernt Sie einen schönen Asphalt haben, und eine andere Breite, die angibt, wie weit der Sand / das Gras / was auch immer außerhalb davon liegt. Dadurch haben wir Spieler, die in der Lage sind, eine angemessene Strecke von der Strecke zu fahren, aber die KI wissen immer noch, wo sich die reale Straßenoberfläche befindet.

Viele Spiele, an denen ich gearbeitet habe, haben auch andere Daten in den Rippen gespeichert. In einem Spiel wurden Informationen zur Schienenbeleuchtung in die Rippen eingebrannt, um auf einfache Weise zu berechnen, ob sich ein Bereich im Schatten befand oder nicht (der dann für das Rendern von Autos verwendet wurde, um zu entscheiden, ob ein Linseneffekt gezeichnet werden soll oder nicht, und andere Effekte). Eine weitere Information darüber, welche Filmkamera-Platzierungen diesen Teil des Splines sehen könnten, sodass wir während der Wiederholungen keine Sichtlinienberechnungen durchführen mussten. Ein weiteres enthielt Informationen darüber, wie viele Fahrspuren sich auf dem Spline befanden, in welche Richtung sie gingen und wie horizontal sich die einzelnen Fahrspuren befanden. Dies ermöglichte es uns, Verkehrswagen einzubeziehen, die korrekt auf Fahrspuren fahren konnten. Rippen eignen sich hervorragend zum Speichern unterschiedlicher Daten, die Sie möglicherweise über Ihre Straßenoberfläche benötigen.

Rippen werden normalerweise in einem Array gespeichert, das dem Spline zugeordnet ist. Aus Geschwindigkeitsgründen hat eine normale Implementierung gleichmäßig verteilte Rippen. Wenn Sie also den Abstand eines Objekts entlang des Splines kennen, können Sie den nächsten Rippenindex im Array berechnen, indem Sie den Abstand entlang des Splines durch den Abstand zwischen den Rippen dividieren. Andernfalls müssen Sie Ihr Rippenarray nicht binär durchsuchen, um die richtigen Daten zur Straßenbreite zu finden.

Ihre Culling-Beschreibung enthält eine gute grundlegende Beschreibung der Verwendung des Spline-Ansatzes, ist jedoch etwas komplizierter als von Ihnen vorgeschlagen. Wenn Sie auf diese Weise Splines zum Culling verwenden, ziehen lange Haarnadelkurven häufig nicht die gegenüberliegende Seite der Kurve, da gemessen an der Entfernung entlang der Strecke die gegenüberliegende Seite der Kurve sehr weit entfernt sein kann, selbst wenn sie in Luftlinie nur wenige Meter entfernt ist. Darüber hinaus unterscheiden sich die Entfernungen, in denen die Weltgeometrie sichtbar ist, normalerweise von denen, in denen das Gleisnetz sichtbar ist, sodass diese auch nicht wirklich in dieses System passen. Ich habe die Erfahrung gemacht, dass es in den meisten Fällen besser ist, sich nicht auf die Spurverfolgungslogik zu verlassen, um zu bestimmen, ob ein Modell gezeichnet werden soll. Es ist viel zuverlässiger und verursacht weniger Störungen, wenn Sie dafür Standard-Kamera-Kegelstumpf-Tests verwenden.

Trevor Powell
quelle
Informativ und Spaß zu lesen Antwort
onedayitwillmake
0

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.

ztech79
quelle
Das klingt so, als würden Sie ein 2D-Spiel beschreiben (Kreise, die durch Pixelfarben kollidieren). Ist es so? Dann ist die Antwort offtopisch.
Kromster
Ich beziehe mich auf ein Spiel in perspektivischer Projektion. glReadpixel kann im 2D-Ortho- oder 3D-Perspektivmodus angewendet werden.
ztech79