Für 2D: Sie brauchen für dieses Problem keine Mathematik, Sie brauchen nur eine benutzerdefinierte Bitblit-Routine. Sie werden Kollisionskandidaten in eine verborgene Oberfläche blitzen, indem Sie ihre Kollisionsmasken auf diese Oberfläche malen und prüfen, ob die Pixel, die Sie gerade zeichnen wollen, sind (Pixel! = 0). Dann wirst du eine Kollision haben. Natürlich sollten Sie die Rechtecke vorgeben, wenn eine Kollision auftreten kann.
Für 3D: Du wirst Mathe (viel) brauchen!
Im Grunde werden Sie jede Oberfläche Ihres Schauspielers gegen jede Oberfläche Ihres Feindes prüfen. Dies wird durch Berechnung eines Flugzeugstrahlschnittpunkts erreicht. Hier ist eine Menge Optimierung möglich, aber es hängt von Ihrer 3D-Darstellung ab. Dies ist auch keine Per-Pixel-Kollision, sondern Per-Vertex-Collision
Ich werde damit beginnen, die Vor- und Nachteile der pro-Pixel-Kollisionserkennung zu beantworten und dann später die mathematischen Aspekte zu betrachten.
Die Erkennung von Kollisionen pro Pixel, die auch als pixelgenaue Kollisionserkennung und möglicherweise genauer bildbasierte Kollisionserkennung bekannt ist, führt zu Kollisionen zwischen Kollisionsobjekten, die als Bilder dargestellt werden. Diese räumliche Methode steht im Gegensatz zu eher geometrischen Methoden, bei denen Polygone und andere geometrische Formen zur Darstellung der Kollisionsobjekte verwendet werden.
Für 2D gibt es im Allgemeinen 3 verschiedene Optionen:
Die bildbasierte Kollisionserkennung ist präzise und einfach zu bedienen und zu verstehen. In Bezug auf Spiele, die Bilder zum Zeichnen verwenden, bedeutet die Verwendung einer bildbasierten Kollisionserkennung, dass sich die Sprites auf dem Bildschirm immer überlappen, wenn sie sich im Kollisionserkennungssystem überlappen. Sie sind auch nützlich für Spiele, bei denen verformbare Kollisionsobjekte benötigt werden, wie für zerstörbare Gelände gesehene Spiele wie Worms 2D, da im Allgemeinen wenig Vorberechnung beteiligt ist. Ihr Hauptnachteil ist, dass sie im Vergleich zu den anderen Methoden sehr ineffizient sind, insbesondere beim Drehen und Skalieren der Kollisionsobjekte.
Einfache geometrische Formen sind einfach zu handhaben und sehr effizient. Wenn keine hohe Präzision benötigt wird oder die Kollisionsobjekte gut zu einfachen geometrischen Formen passen (wenn zum Beispiel Kollisionsobjekte Kugeln sind, passen Kreise perfekt, manchmal sogar besser als Bilder). Ihr größter Nachteil ist ihre Präzision. Für hohe Präzision, wo die Grundformen nicht passen, müssen Sie entweder die einfachen Formen zu komplexeren Formen kombinieren oder Sie müssen allgemeinere und komplexere Formen verwenden. In jedem Fall enden Sie in der dritten Methode.
Komplexe geometrische Formen können in Abhängigkeit von der Komplexität der verwendeten Form (en) zur Darstellung eines Kollisionsobjekts etwas genau und relativ effizient oder ineffizient sein. Ein wichtiger Nachteil ist die Benutzerfreundlichkeit. Wenn die Kollisionsobjekte nicht zu den verfügbaren geometrischen Formen passen, muss entweder die Genauigkeit leiden oder mehrere, möglicherweise unterschiedliche Formen müssen verwendet werden, um sie darzustellen, was Zeit benötigt. Darüber hinaus sind einige der Formen komplex und nicht einfach zu erstellen, es sei denn, Sie können sie automatisch aus einem Bild generieren. Ein wichtiger Vorteil ist, dass Rotation und Skalierung im Allgemeinen effizient und einfach sind, insbesondere im Vergleich zur bildbasierten Kollisionserkennung.
Die bildbasierte Kollisionserkennung wird im Allgemeinen als schlechte Lösung angesehen, da sie insbesondere bei der Verwendung von Rotation und Skalierung häufig ineffizient ist. Da es jedoch so flexibel, präzise und einfach zu bedienen ist, habe ich beschlossen, eine Bibliothek zu implementieren, die das Problem der Effizienz lösen soll. Das Ergebnis ist PoxelColl , das automatisch vorberechnete konvexe Hüllen verwendet, um die bildbasierte Kollisionserkennung zu beschleunigen. Dies bietet Benutzerfreundlichkeit, Flexibilität, Präzision und Effizienz und unterstützt Rotation und Skalierung. Die Hauptnachteile sind, dass es nicht in allen Fällen im Vergleich zu den reinen geometrischen Lösungen effizient ist, und es wird Vorberechnung benötigt, was bedeutet, dass es für verformbare Kollisionsobjekte nicht sehr ineffizient ist.
Für 3D sind die Optionen und Vorteile ähnlich:
Es sollte angemerkt werden, dass die Antwort von Peter Parker für 3D falsch ist; Pixel (Bildelemente) in 2D entsprechen Voxeln (Volumenelementen) in 3D.
Einige wichtige Unterschiede sind, dass die räumliche Methode für 3D viel seltener ist als für 2D. Ein möglicher Grund dafür ist, dass 3D eine zusätzliche Dimension erhält, während die räumliche Lösung noch weniger effizient ist, während die einfachen geometrischen Lösungen immer noch effizient sind. Und bei Spielen ist die Kollisionserkennung im Allgemeinen ein Online-Vorgang, der ein gewisses Maß an Effizienz erfordert, was die Effizienz wichtig macht. Volumes werden daher häufiger in Nicht-Game-Anwendungen verwendet, in denen Kollisionen nicht online ermittelt werden müssen.
Beispiele für Kollisionserkennung mit volumenbasierter Kollisionserkennung finden Sie beispielsweise in Volumetrische Kollision Erkennung für deformierbare Objekte , wo die Verwendung von Volumes anstelle von geometrischen Formen bedeutet, dass sie verformbare Kollisionsobjekte mit beliebig geformten, geschlossenen Flächen handhaben können.
Was die zweite Frage anbelangt, so kann die Mathematik bei bildbasierten Kollisionen von einfach bis komplex reichen.Der einfache Fall besteht im Wesentlichen darin, achsenbündige Begrenzungsrahmen für die Bilder zu verwenden, deren Schnittpunkt zu finden und dann nur die Bilder in der Schnittmenge zu überprüfen. Komplexere Lösungen umfassen die zuvor erwähnte Bibliothek, in der ein konvexer Polygonschnitt erforderlich ist. Und für den 3D-Fall reichen die Lösungen von einfach bis sehr komplex.
Es ist genauer als Scheitelpunkte (oder Hit-Boxen usw.). Ich nehme an, du sprichst hier von 2d (3d wäre Box-Model vs Vertex). Per-Pixel würde Ihnen erlauben, detaillierte Sprites, die kleine Dinge (sagen wir, Raketen) mit realistischer kollidieren würde.
Es ist mehr Mathe und langsamer als die herkömmliche Methode, die wäre, eine Box (oder eine andere leicht mathematische Form wie ein Kreis) zu zeichnen und sagen: "Das ist der Schauspieler, alles hier ist er". Es ist jedoch genauer.
Wenn Sie Vor- und Nachteile abwägen, müssen Sie auch die Kollisionsreaktion in Betracht ziehen. Was möchten Sie tun, wenn eine Kollision erkannt wird? Wenn Sie feststellen, dass ein Objekt ein anderes Objekt trifft, bei dem eines oder beide der Objekte zerstört werden, ist die Kollisionserkennung pro Pixel gut und genau. Wenn Sie möchten, dass das Objekt auf eine andere Weise reagiert, z. B. gegen eine Wand gleitet, springt, usw., dann möchten Sie vielleicht mit einer Art Rechteck / Kreis / Oval arbeiten, das die Kollisionsreaktion glatter erscheinen lässt und mehr konsistent, mit weniger Chance, stecken zu bleiben.
Die Profis wurden bereits erwähnt: Es ist pixelgenau und fair, es gibt keine Falsch-Positiven oder Falsch-Negative. Der Hauptnachteil ist, dass es teuer zu berechnen ist, aber wenn Sie zuerst eine einfache Bounding-Box-Prüfung durchführen, sollte dies kein großes Problem sein. Im Zeitalter von OpenGL und DirectX gibt es ein weiteres Problem: Die Sprite-Daten sind normalerweise Texturen, was bedeutet, dass sie sich im VRAM befinden und Du kannst die Pixelwerte nicht einfach selbst überprüfen. In OpenGL können Sie die glReadPixels
-Funktion verwenden, um den Schnittpunkt von zwei Sprites zurück zum RAM zu bekommen und die Kollision zu überprüfen, oder Sie können die Okklusionsabfrage . Der Okklusionsabfrageansatz sollte eine bessere Leistung haben, da Sie Daten nicht von der GPU zurückverlagern, aber Okklusionsabfragen nicht überall unterstützt werden (dh sie werden in OpenGL ES nicht unterstützt, bitte korrigieren Sie mich, wenn ich falsch liege).
über OpenGL und die Textur-Fall: Sie könnten eine Bit-Matrix für das Bild vorberechnen und testen, ob zwei Pixel sich überlappen.
Die Erkennung von Kollisionen pro Pixel ist ein Relikt aus der Vergangenheit, als Grafik einfach war und 2D-Hardware eine kostenlose Kollisionsprüfung zwischen Sprites und Hintergründen enthielt. Während die heutigen 2D-Grafiken komplexer sind, werden Kollisionskontrollen pro Pixel selten verwendet, insbesondere weil die sichtbare Form des Objekts und die Kollisionsform normalerweise unterschiedlich sind. Kreise oder Kästchen reichen für die meisten Fälle aus. Da OpenGL-basierte Grafikhardware keine Kollisionsprüfung mehr durchführen kann, müssen Sie zusätzlichen Rendering-Code schreiben, indem Sie die CPU ausschließlich für die Kollisionsprüfung verwenden und zusätzliche Bitmap-Daten im Systemspeicher behalten, da auf den Grafikspeicher nicht direkt zugegriffen werden kann.
Tags und Links collision-detection