Was ist der effizienteste Weg, um den Schnittpunkt einer Rakete und eines Bitmap-Geländes zu finden?


10

Nach meiner früheren Frage nach der Neigung eines 2D-Bitmap-Geländes muss ich nun wissen, wie ich den Punkt auf dem 2D-Gelände, auf den die Rakete getroffen hat, am besten finden kann. Natürlich kann ich sehen, ob sich Pixel unter der Rakete im Gelände befinden, aber ich sage, sie hat sich ziemlich tief in das Gelände bewegt.

Was ist der beste Weg, um zurückzutreten und herauszufinden, wo es ursprünglich kollidierte? Ich könnte X Pixel gleichzeitig in Richtung der vorherigen Position des Flugkörpers zurückbewegen, aber was wäre ein guter Wert von X? Und gibt es einen klügeren Weg? Vielleicht die halbe Strecke zurücklegen, dann ein Viertel usw.?


Das Phänomen, das Sie beschreiben, wird allgemein als "Tunneling" bezeichnet. Der beste Weg, um damit umzugehen, ist die Einführung eines Sweep-Tests - wie TetraD und JasonD beide unten erwähnt haben.
Jpaver

Nur "Sweep-Test" zu sagen, hilft mir allerdings nicht wirklich. Wie mache ich das mit einem Bitmap-Terrain?
Iain

Jasons Vorschlag scheint mir am besten zu sein: Pixel für Pixel.
Jpaver

Antworten:


3

Für Kollisionstests sollten Sie keine statischen Tick-by-Tick-Tests durchführen, sondern Traces / Sweep-Tests.

Hier finden Sie eine vollständige Liste verschiedener Formeln für verschiedene Arten von Grundelementen: http://www.realtimerendering.com/intersections.html

Dies setzt natürlich voraus, dass Sie Ihr Gelände in eine Reihe von Grundelementen aufteilen können, gegen die Sie testen können (dh Liniensegmente). Dafür gibt es verschiedene Möglichkeiten.

Siehe auch diese Frage (nur geringfügig verwandt): Was ist ein guter Algorithmus zur Erkennung von Kollisionen zwischen sich bewegenden Kugeln?


Ich dachte an ein zerstörbares Bitmaps-Terrain wie in Worms. Könnten Sie aus einer Bitmap dynamisch Grundelemente generieren oder wäre das zu verrückt?
Iain

1
Ich bin mir sicher, dass Sie dies könnten, aber es könnte einfacher / schneller sein, nur Pixel für Pixel Tests für eine beliebige Bitmap durchzuführen.
Tetrad

MIT EINEM QUADTREE !! (so dauert es nicht ewig)
Bobobobo

3

Die binäre Suche hilft nicht, wenn Sie dünne Landschaften und sich schnell bewegende Projektile haben - Sie könnten sie vermissen.

Ich denke, Ihre beste Option ist es, eine Linie pixelweise über die Vorderseite des Projektils entlang des Weges zu ziehen, den es nimmt. Sie können zuerst eine Begrenzungsprüfung für das gesamte Volume durchführen, um zu vermeiden, dass dies bei jedem Schritt durchgeführt wird.


Was ist binäre Suche?
Iain

1
Entschuldigung - die binäre Suche ist mehr oder weniger das, worüber Sie in der Frage gesprochen haben. Sie beginnen in der Mitte und teilen den Suchraum durch zwei, bis Sie auf die Antwort konvergieren. In vielen Fällen ist es optimal, aber in Ihrem Fall würde es nicht funktionieren (Sie könnten die richtige Antwort vollständig überspringen).
JasonD

3

Da es unwahrscheinlich ist, dass die Rakete in jedem Frame eine große Anzahl von Pixeln bewegt (auf dem Bildschirm wäre dies nicht glatt), sehe ich keinen Grund, nicht nur jedes Pixel auf dem Pfad zu überprüfen. Der Bressenham-Zeilenalgorithmus ist Ihr Freund und stellt sicher, dass Sie auch eine lokale Kopie Ihrer Bitmap haben, da Sie im Allgemeinen nicht für jedes Pixel auf den Videospeicher zugreifen möchten. Dies setzt voraus, dass Ihr Bitmap-Terrain völlig zufällig ist (gemäß zerstörbarem Wurm-Terrain). Wenn Ihre Welt auf Kacheln basiert, können Sie jede Kachel überspringen, von der Sie wissen, dass sie zunächst leer ist. Wie bereits erwähnt, konnte ich mir jedoch keine Plattform vorstellen, die zu langsam wäre, es sei denn, Sie haben eine große Anzahl von Raketen zu überprüfen Um nur Pixel für Pixel zu testen, müssen Sie Ihre Welt nicht in Grundelementen definieren (ein Wurmklon würde dies schwierig machen).


Ja, ich dachte an ein Worms-ähnliches Terrain. Könnten Sie es dynamisch in Kacheln aufteilen und dann leere Kacheln markieren, die nicht überprüft werden sollen? Wenn es viele Raketen gleichzeitig gäbe, würde das die Dinge vielleicht etwas beschleunigen?
Iain

Glaubst du, ich sollte mich Pixel für Pixel vorwärts bewegen und die Schnittmenge überprüfen, anstatt rückwärts zu treten?
Iain

Ich denke, alle drei Antworten haben eine Vorwärtssuche vorgeschlagen. Das Rückwärtsprüfen funktioniert nicht, wenn der Vorwärtsschritt dazu führt, dass eine Szenerie übersprungen wird.
JasonD

Ja, definitiv vorwärts.
Kaj

1

Zusätzlich zu den anderen Antworten gibt es einige Dinge, die Sie tun können, um dies zu beschleunigen, wenn Sie eine kleine Buchhaltung in Bezug auf das "Sammeln" einer Reihe von Pixeln in Blöcken mit "bekanntem ähnlichen Zustand" durchführen möchten. Sie können beispielsweise die Höhe des höchsten Geländestücks speichern, sodass Sie davon ausgehen können, dass die Rakete nichts trifft, solange sie darüber liegt. Sie können auch die Höhe des niedrigsten "Luft" -Raums speichern, damit Sie wissen, dass die Rakete, wenn sie diese Höhe erreicht, etwas getroffen haben muss (obwohl dies am besten als Überprüfung der geistigen Gesundheit verwendet werden kann). Wenn Sie darüber hinaus gehen, können Sie Rechtecke speichern, die Bereiche darstellen, die ausschließlich Gelände sind, und andere Rechtecke, die ausschließlich aus Luft bestehen. Dies ist jedoch möglicherweise mehr Arbeit als Wert.

Letztendlich wird die beste Methode wahrscheinlich darin bestehen, "die Höhe jeder Geländesäule zu speichern" und dann einfach die Raketenhöhe bei jedem Schritt ihres Weges zu berechnen. Ich kann nicht mit moderneren Spielen sprechen, aber ich glaube, als Sie eine "Höhle" in Scorched Earth errichteten, fiel das Gelände über dieser Höhle direkt nach unten und hinterließ keine Überhänge. Wenn Sie Überhänge wünschen, wird die Arbeit etwas größer sein, aber es wird eine Erweiterung dieser Grundidee sein. (Hinweis: Lassen Sie die Grundidee zuerst funktionieren!)

Da Ihr Gelände vermutlich völlig willkürlich ist, gibt es keine Abkürzungen. Selbst wenn Sie Ihr Terrain zu einem Spline oder etwas anderem gezwungen haben, wird dies verärgert, sobald Sie damit beginnen, es zu zerstören, und Line-Spline-Schnittpunkttests sind iterativ und nicht perfekt oder erschöpfend und für Ihre Art von Problem sinnlos langsam.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.