Also mache ich ein Artillerie-Spiel, ähnlich wie Worms, mit all den üblichen Dingen wie zerstörbarem Gelände usw. ... und während ich eine Kollision pro Pixel verwenden könnte, die mir keine Kollisionsnormalen oder ähnliches gibt. Das Konvertieren in ein Netz würde auch bedeuten, dass ich eine vorhandene Physikbibliothek verwenden könnte, die besser wäre als alles, was ich selbst machen kann.
Ich habe Leute gesehen, die dies erwähnt haben, indem sie Marching Squares verwendet haben, um Konturen in der Bitmap zu erhalten, aber ich kann nichts finden, das erwähnt, wie diese in ein Netz umgewandelt werden können (es sei denn, es bezieht sich auf ein 3D-Netz mit Konturlinien, die unterschiedliche Höhen definieren). das ist NICHT was ich will). Im Moment kann ich eine grundlegende Kontur für Marschquadrate erhalten, die ungefähr so aussieht (wobei die gitterartigen Linien im Hintergrund die Zellen der Marschquadrate wären):
Das muss interpoliert werden, um ein glatteres und genaueres Ergebnis zu erzielen, aber das ist die allgemeine Idee. Ich hatte ein paar Ideen, wie ich daraus ein Netz machen könnte, aber viele davon würden in bestimmten Fällen nicht funktionieren, und die, von der ich dachte, dass sie perfekt funktionieren würde, hat sich als sehr langsam herausgestellt und ich habe sie noch nicht einmal fertiggestellt noch! Idealerweise möchte ich, dass alles, was ich am Ende benutze, schnell genug ist, um jeden Frame für Fälle wie schnell schießende Waffen oder Grabwerkzeuge zu erstellen.
Ich denke, es muss eine Art Algorithmus / Technik geben, um so etwas in ein Netz zu verwandeln, aber ich kann anscheinend nichts finden. Ich habe mir einige Dinge wie die Delaunay-Triangulation angesehen, aber soweit ich das beurteilen kann, werden konkave Formen wie im obigen Beispiel nicht richtig behandelt und auch keine Löcher im Gelände berücksichtigt.
Ich werde die Technik, die ich mir zum Vergleich ausgedacht habe, durchgehen und ich werde sehen, ob jemand eine bessere Idee hat. Interpolieren Sie zunächst die Konturlinien der Marching Squares, erstellen Sie Scheitelpunkte an den Linienenden und erhalten Sie Scheitelpunkte, an denen Linien die Zellkanten kreuzen (wichtig). Erstellen Sie dann für jede Zelle, die Scheitelpunkte enthält, Polygone, indem Sie 2 Scheitelpunkte und eine Zellecke als 3. Scheitelpunkt verwenden (wahrscheinlich die nächstgelegene Ecke).
Tun Sie dies für jede Zelle und ich denke, Sie sollten ein Netz haben, das die ursprüngliche Bitmap genau darstellt (obwohl es nur Polygone an den Rändern der Bitmap gibt und große ausgefüllte Bereiche dazwischen leer sind). Das einzige Problem dabei ist, dass jedes Pixel für die ersten Marschquadrate einmal durchlaufen wird und dann mindestens zweimal jede Zelle (Bildhöhe + 1 x Bildbreite + 1) durchlaufen wird, was für jede anständige Größe sehr langsam ist Bild...
quelle
Antworten:
Ich habe noch nie mit 2D-Physik-Engines gearbeitet, ich bin mir nicht sicher, wie das Kollisionsnetz genau aussehen soll.
Wenn es sich lediglich um eine Reihe von 2D-Dreiecken handelt, sollten Sie sich mit Triangulationsmethoden befassen. Zum Beispiel eingeschränkte Delauney-Triangulation .
Das ist eine gute Sache, wenn es darum geht, diese Dreiecke zumindest zu rendern, und kann auch für die Kollisionserkennung gut sein oder auch nicht.
Eine eingeschränkte Delauny-Triangulation enthält feste Kanten, die Ihre erkannten Kanten wären. Diese Bibliothek bietet möglicherweise das, was Sie benötigen
quelle