Seite 1 von 1
Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 13:08
von kaytec
Hallo,
habe mal verucht eine pixelgenaue Kollisionserkennung zu basteln. WIrd auf meinem Rechner (Aspire one), bei der Überschneidung der BBoxes langsamer, da ich eine Liste mit den äußeren Punkten ohne Transparenz erstelle und diese vergleiche.
http://www.python-forum.de/pastebin.php?mode=view&s=152
Gruß Frank
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 13:20
von BlackJack
Ich würde ja eher auf
pygame.sprite.collide_mask() bauen als mir da in Python was langsames selber zu basteln.
Edit: Ups habe gar nicht gesehen, dass es nicht um Pygame ging. Aber grundsätzlich wäre etwas mit Transparenz und Bildoperationen vielleicht auch mit PIL eine gute Idee.
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 13:24
von kaytec
@BlackJack : Ich verwende doch Pil ?
Gruß Frank
edit: gesteuert wird mit den Pfeiltasten.
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 13:26
von Hyperion
Ich habe mir Deinen Code nicht genauer angeguckt, aber vielleicht kannst Du die Reihenfolge optimieren, in der Du Objekte auf Kollision prüfst? Also ggf. diejenigen, bei denen es wahrscheinlicher ist, zuerst, manche gar nicht usw.
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 13:30
von kaytec
@ Hyperion: Es werden zwar alle Objekte geprüft, doch nur bei einer Überschneidung der BBoxes fängt das Vergleichen über Listen an und da macht es Probleme.
Gruß Frank
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 13:47
von BlackJack
@kaytec: Du verwendest PIL aber nicht für die Kollisionserkennung soweit ich das sehe. Ich meine Bildoperationen auf Transparenzmasken, also zum Beispiel eine Und-Verknüpfung von zwei Bitmasken die auf der Transparenz basieren und dann schauen ob Pixel gesetzt sind.
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 13:52
von kaytec
@BlackJack: Für die Kollisionerkennung nicht - ich lese mit Pil nur die Punkte am Umfang des Objektes aus und diese vergleiche ich dann mit den Punkten des anderen Objektes. Das mit Bitmasken ... und so weiter verstehe ich jetzt nicht ?
Gruß Frank
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 14:03
von BlackJack
@kaytec: Wenn man aus den Bildern Schwarz/Weiss-Bilder erstellt bei denen die nicht-transparenten Pixel gesetzt sind, kann man beide Bilder -- entsprechend der Positionen verschoben -- Und-Verknüfen. Wenn im Ergebnis Pixel gesetzt sind, dann kollidieren die nicht-transparenten Teile der Bilder, ansonsten halt nicht.
Rufst Du `build_shape()` eigentlich bei jeder Überprüfung auf!? Da sollte man vielleicht über eine Klasse nachdenken die das Bild und das dazugehörige "shape" kapselt und die "shape"-Daten nur *einmal* berechnet.
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 14:11
von kaytec
@BlackJack: Ich habe es zuerst mit einem kompletten Bild ohne Transparenz versucht und dann hatte ich bei dem Raumschiff an die 1200 Bildpunkte, deswegen habe ich es auf die Umrisse begrenzt. Ich erzeuge bei jedem Vergleich eine neue Liste, da sich die Koordinaten der Bildpunkte ja ständig verändern.
Gruß Frank
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 14:14
von kaytec
Hier mal ein kleines Beispiel mit dem Auslesen der Daten auf Transparenz
Code: Alles auswählen
import base64
import StringIO
from PIL import Image
ENEMY_SHIP = """R0lGODlhIQANAKECAAAAAPhIH////////yH5BAEKAAAALAAAAAAhAA0AAAIyhI
8Yt+kPQwMS2ihzvpzqv3UOSFaiUaYmp7bXh8ZyA481zcw1qvFt79mATo8f0fZL
/goAOw=="""
im = Image.open(StringIO.StringIO(base64.decodestring(ENEMY_SHIP))).convert("RGBA")
im.load()
row = list()
shape = list()
for rgba in list(im.getdata()):
if rgba[3] == 0:
transparency = 0
else:
transparency = 1
row.append(transparency)
if len(row) == im.size[0]:
shape.append(row)
row = list()
for row in shape:
print row
Gruß Frank
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Sonntag 13. Februar 2011, 17:56
von kaytec
Hallo !
Ich habe das Problem gelöst. Ich erstelle die Shapes vorher und zähle später nur die aktuelle Position hinzu, indem ich Bezug auf linke obere Ecke des Spielfeldes nehme,
http://www.python-forum.de/pastebin.php?mode=view&s=153
Gruß Frank
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Mittwoch 16. Februar 2011, 23:33
von kaytec
Hallo !
habe noch einige Verbesserungen vorgenommen.
http://www.python-forum.de/pastebin.php?mode=view&s=156
Gruß Frank
Re: Pixelgenaue Kollisionserkennung mit PIL
Verfasst: Samstag 26. Februar 2011, 22:22
von kaytec
Hallo,
habe die Kollisionserkennung aufgeteilt, damit es die Möglichkeit zur pixelgenauen Erkennung und zur Erkennung mit bbox gibt.
Feuern mit Space und Lenkung mit Pfeiltasten.
http://www.python-forum.de/pastebin.php?mode=view&s=157
Gruß Frank