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.?
Antworten:
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?
quelle
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.
quelle
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).
quelle
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.
quelle