Dienstag, 22. Juli 2014

Separating Axis Theorem statt farseer-Engine

Da ich mich mal wieder nach Alternativen zur farseer-Engine umgesehen habe ( war mir doch wein wenig zu komplex ;) ), bin ich auch das SAT ( Separating Axis Theorem ) gestoßen und es war genau das, was ich brauche.

Wie funktioniert es?
Der Grundgedanke ich einfach: Sobald ich eine Linie zwischen zwei Körpern zeichnen kann und die Linie diese Körper nicht berührt, berühren sich auch die Körper nicht ( s. Abb1 ).

Abb1.: Es wird eine Linie zwischen zwei Objekten gebildet, ergo berühren sie sich nicht.

Wenn es jedoch keine Lücke gibt, also von allen Seiten ( man bildet diese Linie immer entlang zweier Eckpunkte eines Polygons ) die Projektionen ( blaue Linien oben ) überlappen, so berühren/schneiden sich die Polygone ( s. Abb2 ).
Abb2.: Alle Projektionen ( pinke und blaue Linien ) auf den gestrichelten Linien überlappen sich.

Wenn ihr mehr wissen möchtet, könnt ihr gerne bei der Suchmaschine eures Vertrauens suchen, ihre werdet bestimmt was finden. Das Prinzip ist eigentlich einfach, nur wirkt es im ersten Moment sehr abtrakt.

Wann ich das ganze im Map-Editor einbauen werde weiß ich noch nicht ganz genau, aber erstmal wollte ich die Einstellungen/Eigenschaften der Objekte unterbringen ( sprich Änderung der Position, etc. ).
In der nächsten Version ( 0.0.4 ) wird dieses System aber definitiv vorhanden sein.

mfg
Hauke

Quellen:
Abb1.: http://back2basic.phatcode.net/?Issue_%231:2D_Convex_Polygon_Collision_using_SAT ( 22.07.2014 )
Abb2.: http://www.codezealot.org/archives/55 ( 22.07.2014 )

2 Kommentare:

  1. Cool! Aber wozu wird das in Arengu überhaupt benötigt? Sind doch eh alles Vierecke oder?

    AntwortenLöschen
    Antworten
    1. Gute Frage! BISHER sind es Vierecke, aber das möchte ich ändern. wenn man zum Beispiel den Brunnen nimmt, so ist die Kollisionsberechnung sehr ungenau, da der Brunnen rund ist, ich aber mit einem Rechteck die Kollision überprüfe. Deswegen möchte ich auf dieses System umsteigen, damit die Kollisionserkennung genauer wird.

      Löschen