Possible improvements

Jun 28, 2011 at 10:21 PM

Hi all there,

I took a look to your collision detection code.
I couldn't see exactly how it works, so I think there is a collection of objects that will be checked for collisions, so building them to pairs and checking them. (Sorry when I got it the wrong way, since the code was a bit to complex to understand every LOC ^^)
In my case I had my pain finding out a really fast mass collision handling with the result of very short and fast collision detection with no need of pairing them anymore! May you are interested in, so I will explain my style of implementation below:

 

In deutsch, falls es unter euch einige gibt die mein schlechtes Englisch nicht mehr ertragen können ^^

Ich hab mir mal aus Neugier euren Code zur Kollisionsprüfung angesehen. Da mir der Code aber zu komplex war konnte ich irgendwie erkennen,
dass eine Klasse ein Paar von 2 Objekten definiert und durch diese Paare im folgenden die eigentliche Kollisionsprüfung stattfindet.

Sprich wenn es eine Collection von Objekten ist, dann wird eine Enumerationsschleife je 2 Objekte in eine Paar-Klasse packen, solange diese Objekte nicht die selben sind (Sprich eine Schleife, eine Paar-Instanz pro Schleife und eine Prüfung ob das Objekt nicht das selbe ist (wie das andere oder die anderen?)). Danach die Prüfung (wieder eine Schleife die nur halb so viele Durchläufe wie Objekte macht?)

Leider hab ich eure Lösung der Prüfung zu spät gesehen, ein Schulkamerad hat mich darauf aufmerksam gemacht. Aber mit einer Kiste Bier und ordentlich Mukke viel mir folgende Lösung ein, die euch auch interessieren könnte:

(C#-Beispielcode)

// Liste der Objekte welche miteinander kollidieren können
List<Element> elemente;

for (Int32 a = 0; a < elemente.Count; a++)
for (Int32 b = a + 1; b < elemente.Count; b++)
PrüfeAufKollision(elemente[a], elemente[b]);

Bisher denke ich immer noch darüber nach ob da nicht etwas dran faul sein könnte aber so im Prinzip hat es immer funktioniert, nur halt die Bedenken weil es an sich ein 3-Zeiler ist.
Die Kollisionsprüfung an sich übernimmt die "PrüfeAufKollision"-Methode und behandelt die Objekte die als "a" und "b" übergeben werden.

Theoretisch gesehen, mit beispielsweise 10 Elementen in der Liste, wird die Iteration immer kleiner gegen Ende. Die Objekte "a" und "b" können nie die selben sein.

Wenn "a" das 1. Objekt ist, so kann es nur mit den Objekten der Stellen 2 bis 20 kollidieren. 

Wenn "a" nun das 4. Objekt ist, so wurde es vorher schon mit 1, 2 und 3 geprüft und kann nur noch (effektiv) mit den Objekten 5 bis 20 kollidieren.

So fällt eigentlich die Klasse für die Paarbildung weg und es wird bei 20 Objekten lediglich 210 mal auf Kollision geprüft.
Vielleicht konnte ich euch damit helfen ^^

Mit freundlichen Grüßen,
Gökhan Karabulut 

Coordinator
Jun 29, 2011 at 10:01 AM

Hi Gökhan,

thank you for your advice. The loop you suggested is actually what the BruteForceBroadPhase class is doing to check collisions. The PairManager is for something different: It is used to cache collision pairs and to remove doubles. With this loop no doubles are possible, that is right.

For more information about this topic please have a look at my blog (German language):

http://mitohnehaare.de/category/kollision/

The concept of the PairManager is described there and the loop you suggested too.

If you want further discussions about this topic in german language feel free to use the comment function in my blog or the forum http://xnamag.de.

Cheers,

Glatzemann