Kann mir jemand erklären, pro-pixel collision detection?
Kann jemand erklären die vor-und Nachteile und jeder mit Mathe zu tun mit es?
- Klärung auf 2d / 3d und einige Beispiele oder weitere Details würden gehen entlang Weg zu helfen, mir und anderen die Frage beantworten.
- Ich, die zweite, bitte klären.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für 2D:
Sie brauchen keine Mathematik für dieses problem, Sie müssen nur eine benutzerdefinierte bitblit-routine. Sie blit-Kollision Kandidaten in einer verborgenen Oberfläche durch die Malerei Ihre collisionmasks auf dieser Fläche und prüfen, ob die Pixel, die Sie wollen einfach nur, um zu zeichnen sind (pixel != 0) . Dann hast du eine Kollision. Natürlich sollten Sie die Vorprüfung durch umschließende Rechtecke, wenn eine Kollision auftreten kann.
Für 3D:
Benötigen Sie Mathe(viel)!
grundsätzlich checken Sie jede Fläche von Ihrem Schauspieler gegen jede Oberfläche Ihres Feindes.
Dies erfolgt durch die Berechnung eines Flugzeug-ray-Kreuzung. Es gibt eine Menge von Optimierung hier möglich, aber es hängt von Ihrem 3d-Darstellung. Dies ist auch keine Pro-Pixel-Kollision, aber Pro-Vertex-Kollision
Beginnen werde ich mit der Beantwortung der vor-und Nachteile von per-pixel collision detection, und dann erwägen, die mathematischen Aspekte später.
Pro-pixel-Kollision-Erkennung, auch bekannt als pixelgenaue Kollisionserkennung, und vielleicht genauer bildbasierte Kollisionserkennung, ist das finden von Kollisionen Kollision zwischen Objekten dargestellt, die als Bilder. Diese räumliche Methode steht im Gegensatz zu den geometrischen Methoden, bei denen die Polygone und andere geometrische Formen verwendet werden, um repräsentieren die Kollision von Objekten.
Für 2D -, gibt es grundsätzlich 3 verschiedene Möglichkeiten:
Image-based collision detection ist präzise und einfach zu bedienen und zu verstehen. In Bezug auf die Spiele, verwendet Bilder, die für die Zeichnung, mithilfe image-basierter Kollisionserkennung, bedeutet, dass, wenn die sprites auf dem Bildschirm überlappen, Sie sich auch überlappen, die in der Kollision-Detektion-system. Sie sind auch nützlich für Spiele, wo verformbaren Kollision von Objekten erforderlich sind, z.B. für zerstörbare terrain gesehen, Spiele wie Worms 2D, da es im Allgemeinen wenig pre-Berechnung einbezogen. Ihr Nachteil ist, dass Sie sehr ineffizient im Vergleich zu den anderen Methoden, besonders bei der Rotation und Skalierung der Kollision von Objekten.
Einfachen geometrischen Formen sind einfach, mit zu arbeiten und sehr effizient. Wenn hohe Präzision gefragt ist, nicht benötigt, oder die Kollisions-Objekte auch mit einfachen geometrischen Formen (zum Beispiel, wenn Ihre Kollisions-Objekte sind Kugeln, Kreise ist eine perfekte Passform, manchmal sogar besser als die Bilder). Ihr Nachteil ist Ihre Präzision. Für hohe Präzision, wo die Grundlagen, die Formen passen nicht, haben Sie entweder zu kombinieren, die von einfachen Formen zu komplexeren Formen, oder verwenden Sie die allgemeineren und komplexen Formen. In jedem Fall, Sie am Ende in der Dritten Methode.
Komplexe geometrische Formen können etwas präzise und relativ effizient oder ineffizient sein, abhängig von der Komplexität der verwendeten Form(s) zum darstellen einer Kollision Objekt. Ein wichtiger Nachteil ist die Benutzerfreundlichkeit. Bei der Kollision von Objekten passt nicht mit den verfügbaren geometrischen Formen, entweder die Präzision darunter leiden muss, oder mehrere, ggf. verschiedene Formen werden verwendet, um darzustellen, was Zeit in Anspruch nimmt. Außerdem werden einige der Formen sind Komplex und nicht leicht zu erstellen, es sei denn, Sie erzeugen Sie aus einem Bild automatisch. Ein wichtiger Vorteil ist, dass die rotation und die Skalierung ist in der Regel effizient und einfach, vor allem im Vergleich zu bildbasierten Kollisionserkennung.
Image-based collision detection ist allgemein gesehen als eine schlechte Lösung, weil es ist Häufig ineffizient, vor allem, wenn mit rotation und Skalierung. Da es allerdings so flexibel, präzise und einfach zu bedienen, habe ich beschlossen, die Bibliothek, die versucht zu lösen das Problem der Effizienz. Das Ergebnis ist PoxelColl, die verwendet automatisch die im Voraus berechnete konvexe Hülle um die Geschwindigkeit des image-based collision detection. Dieses bietet einfache Handhabung, Flexibilität, Präzision und Effizienz, und unterstützt die rotation und die Skalierung. Die wichtigsten Nachteile ist, dass es nicht in allen Fällen eine effiziente gegenüber dem reinen geometrischen Lösungen, und er verwendet pre-Berechnung erforderlich ist, was bedeutet, es ist nicht sehr ineffizient für deformierbare Kollision von Objekten.
Für 3D, die Optionen und Vorteile sind ähnlich:
Es sollte angemerkt werden, dass Peter Parker ' s Antwort ist falsch, für 3D, Pixel (picture elements) in 2D entsprechen voxels (Volumen-Elemente) in 3D.
Einige wichtige Unterschiede sind, dass die räumliche Methode ist viel seltener für 3D als bei 2D. Ein möglicher Grund ist, dass da 3D fügt eine zusätzliche dimension, die räumliche Lösung wird noch weniger effizient, während die einfachen geometrischen Lösungen noch effizienter. Und in spielen, die Kollisionserkennung ist in der Regel ein online-Betrieb, erfordern einige Niveau der Effizienz, so dass die Effizienz wichtig. Die Bände sind daher mehr oft in nicht-Spiel-Anwendungen, bei denen Kollisionen nicht bestimmt werden müssen online.
Beispiele für die Kollisionserkennung mit volume-basierende Kollisionserkennung, siehe zum Beispiel Volumetrische Kollisionserkennung für deformierbare Objekte, wo Ihre Verwendung von volumes anstelle von geometrischen Formen bedeutet, dass Sie behandeln können verformbaren Kollision von Objekten mit beliebig geformten, geschlossenen Oberflächen.
Als für die zweite Frage, die Mathematik, die in Bild-basierten Kollisionen können reichen von einfach bis Komplex. Der einfache Fall ist grundsätzlich die Verwendung von axis-aligned bounding Boxen für die Bilder, finden Ihren Schnittpunkt, und dann nur die Bilder in der Kreuzung. Komplexere Lösungen umfassen die Bibliothek, die ich vorher erwähnte, wo konvex-polygon-Schnittpunkt ist erforderlich. Und für den 3D-Fall Lösungen reichen von einfach bis sehr Komplex.
Ist es genauer als die Eckpunkte (oder hit-Boxen usw). Ich nehme an, Sie reden hier über die 2d - (3d-wäre-box-Modell vs vertex). Pro-pixel würde Ihnen erlauben, detaillierte sprites, die kleine Sachen (Raketen, sagen) kollidieren würde mit mehr realistisch.
Es ist mehr Mathematik und langsamer als die herkömmliche Methode, die zu ziehen ein Feld (oder einige andere, leicht mathematische Form wie ein Kreis) und sagen, 'das ist der Schauspieler, nichts hier ist er'. Es ist jedoch genauer.
Beim sprechen vor-und Nachteile Sie haben auch zu berücksichtigen, Kollision Antwort. Was wollen Sie tun, wenn eine Kollision erkannt wird? Wenn Sie die Erkennung eines Objekts auf ein anderes Objekt trifft, wo das Ergebnis eine oder beide der Objekte Sie zerstört wird, dann pro pixel collision detection ist eine gute und genaue. Wenn Sie möchten, dass das Objekt auf irgendeine andere Weise reagieren, D. H. verschiebbar gegen eine Wand, hüpfen, etc... dann kann man arbeiten will, mit irgendeiner Art von bounding-Rechteck/Kreis/oval, das wird die Kollision Antwort erscheinen glatter und konsistenter, mit weniger Wahrscheinlichkeit des Erhaltens stecken.
Die Vorteile wurden bereits erwähnt: Es ist pixel-perfekt und fair, es gibt keine false positives noch false negatives. Der größte Nachteil ist, dass es teuer zu berechnen, aber wenn Sie eine einfache bounding-box prüfen Sie zuerst, dies sollte kein großes problem sein. Im Alter von OpenGL und DirectX gibt es noch ein problem: Die sprite-Daten sind in der Regel Texturen, das heißt, Sie sind in den VRAM und die Sie nicht kontrollieren können die pixel-Werte einfach Selbst. In OpenGL können Sie die
glReadPixels
- Funktion, um den geschnitten Teil des zwei-sprites zurück zu RAM und überprüfen Sie die Kollision ein, oder verwenden Sie die occlusion query. Der occlusion query Ansatz sollte eine bessere Leistung, wie Sie bewegen sich nicht, Daten von der GPU, aber occlusion queries werden nicht unterstützt überall (dh. Sie werden nicht unterstützt in OpenGL ES, jemand bitte korrigieren Sie mich, wenn ich falsch Liege).Einnahme über OpenGL und die textur-Fall: man könnte das vorberechnen einer bit-matrix für das Bild und testen, ob zwei Pixel überstehen.
Pro pixel collision detection ist ein Relikt aus der Vergangenheit, als die Grafik wurde einfach und 2D-hardware kostenlos enthalten Kollisionsprüfung zwischen sprites und Hintergründe. Während der heutigen 2d-Grafik ist komplexer, per-pixel-Kollision überprüft werden selten verwendet, vor allem, weil die Objekt-sichtbaren Gestalt und Zusammenstoß und Form in der Regel anders. Kreise oder Boxen sind ausreichend für die meisten Fälle. Auch, da die opengl-basierter Grafik-hardware kann nicht Kollisionsprüfung mehr, die Sie schreiben müssen zusätzliche rendering-code, verwenden die CPU für den alleinigen Zweck der Kollisionskontrolle, während zusätzliche bitmap-Daten im Arbeitsspeicher, da die Grafik-Speicher nicht direkt zugegriffen werden kann.