Pixelgenaue 2D Kollision C++ OpenGL

WinDWalker

Mitglied
Hi alle zusammen :p ,

ich hab mal wieder eine Frage:

Ich schreib grad nen Lode Runner Clone (kultiges C64 game), der Editor, die Levels das einlesen der Levels etc. funktioniert hervorragend.

Eine Bounding Box Kollision funktioniert ebenfalls:

Code:
bool BoundinBoxCollision()
{
   if (   100 + Objekt1.Xpos > 200 - textures->width 
      && 100 - Objekt1.Ypos > 200 - textures->width
      && 164 + Objekt1.Xpos > 264 - textures->width 
      && 100 - Objekt1.Ypos > 200 - textures->width
      && 164 + Objekt1.Xpos < 264 + textures->height 
      && 164 - Objekt1.Ypos < 264 + textures->height
      && 100 + Objekt1.Xpos < 200 + textures->height 
      && 164 - Objekt1.Ypos < 264 + textures->height) return(true);

    return(false); // Objekte sind kollidiert 
}

Ich brauche aber noch eine pixelgenaue Kollisionsabfrage!

Ich benutze tga files mit einem durchsichtigen Rand von 5 Pixeln.
Ich hab gelesen dass man eine pixelgenaue Kollisionsabfrage am besten so gestaltet, daß man testet ob sich Pixel überhaupt überlappen (BoundingBox), wenn dem so ist testet man ob sich transparente Pixel überlappen ==> Keine Kollision
oder ob sich transparente und sichtbare Pixel überlappen ==> Kollision

Ich beiß mir nur grad an der pixelgenauen Kollision die Zähne aus, weiß jemand wie das gemacht wird bzw woher ich Code Snippets( (!) ) oder ein gutes Tutorial zu diesem Thema bekommen kann ? :confused:

Vielen Dank im voraus

WindWalker
 
WinDWalker hat gesagt.:
ob sich transparente und sichtbare Pixel überlappen ==> Kollision

falsch! eine Kollision ist es erst wenn Sichtbar und Sichtbar aufeinander treffen! Da ich mich mit Open GL aber nicht auskenne kann ich dazu nicht viel sagen. Gibt es denn nicht irgendwelche Funktionen mit denen man einzelne Pixel holen kann?
 
Hi Flegmon,

ne eben nicht !
Aber pures c++ reicht wenn dun n sample dazu hast.

P.S.: wenn sich sichtbar und sicht bar überlappen dann isses ne Kolli hast vollkommen recht !

WinDWalker ;)
 
Pixelgenaue Kollisionen (wenn die schon wirklich sein müssen) würde ich generell an OpenGL bzw. DirectX vorbei machen. Texturen bzw. einzelne Pixel daraus auslesen ist FURCHTBAR SCHRECKLICH A****LAHM (im Sinne von langsam). Die Grafikkarten heutzutage sind extrem auf Schreibzugriff optimiert, und Lesezugriff geht zwar, ist aber wahnsinnig langsam.

Du bist da besser beraten, für die einzelnen Objekte eine Kollisionsmaske im normalen Speicher zu halten (als simples Array), wo du dann die Abfragen machen kannst.

Wenn sich also die Bounding Boxen zweier Objekte überlappen, berechnest du dir zunächst die Schnittmenge, das "Intersection Rect". Mit diesem Intersection Rect und den Koordinaten deiner Objekte kannst du dir die Pixel aus den Kollisionsmasken holen und vergleichen.
 
Zurück