Kollision mehrerer Objekte 2D

C

coreytaylor211

Fortgeschrittenes Mitglied
5
Hallo ich stehe momentan vor einem Problem und zwar habe eine Klasse Kugel, diese wird in einer andern Klasse aufgerufen und in einer for schleife 50 mal gezeichnet.
Die Kollision mit dem Rand ist bei allen 50 Kugeln kein Problem.
Meine Frage ist jetzt wie kann ich jetzt von der Kugel die x und y Koordinaten herausfinden damit ich Prüfen kann ob Sie miteinander Kollidieren?
 
Ein kleiner Nachtrag zum Verständniss.
Die 50 Kugeln werden durch die Random Klasse auf zufällige x und y Positionen gelegt.
 
Jede einzelne Kugel auf Kollision mit jeder anderen Kugel prüfen. Da wäre mein Vorschlag 2 verschiedene Kollisionsprüfungen durchzuführen:

Die erste ist welche Kugeln überhaupt mit deiner zu prüfenden Kugel überhaupt zusammenstoßen können, um die Liste der feineren Prüfung zu verringern..
Die zweite ist dann die feinere Prüfung wie die Kugeln zusammenstoßen, je nach dem wie Komplex du das machen möchtest. (Ich weiß ja nciht welches Modell du benutzt, aber ebstimmt möchtest du so eine Kollision die vom Winkel der Beiden Kugeln abhängt haben und nciht einfach die Geschwindigkeitsvektoren der Beiden Kugeln die zusammenstoßen vertauschen als wenn sich nur zwei unendlich kleine Massepunkte treffen würden, die ihre Dynamiken an den jeweils anderen abgeben)

Wenn du eine einfache sturre Abfrage aller Kugeln ohne Optimierung durchführst wären dass 50*50=2500 Kollisionsabfragen. Wenn du es stufenweise machst dann könnte das so aussehen:

1. Prüfung: Gucken Welche Kugeln in einem x Einheiten Radius vond er Kugel entfernt sind und in die Liste für die feinere Prüfung aufnehmen. Sagen wir durchschnittlich wären das immer 10. Somit hast du schon mal 50*50 Kollisionsabfragen für jede Kugel, die Aber vom Rechenaufwand nciht so hoch sind weil du nur abfragst ob die in einem bestimmten Radius sind.

2. Prüfung: Die durchschnittlich 10 Kugeln für die feinere Prüfung werden gegen die zu prüfende Kugel abgefragt. Hier kommt dein feiner "exakter" Kollisionsalgorithmus zum Einsatz. Das wären 50*10 feine Kollisionsabfragen, also 500 feine Kollisionsabfragen.


Beid er Methode hättest du 2500 einfache Kollisionsabfragen plus 500 feine Kollisionsabfragen gegenüber einer Methode, wo du einfach alle möglichen Kugeln durch 2500 feine Kollisionsabfragen jagen lässt. Je nachdem wie kompliziert dein feiner Algo ist macht das durchaus Sinn.


Ist schon wieder sehr lang egworden der Psot aber der ganzen Thematik wird so ein Psot natürlich nciht im geringsten Gerecht. Da gibt es ncoh sowas wie BAcktracking falls man mehrere Zusammenstöße in einem Frame berechnen müsste (Kugel A stößt Kugel B ab und A prallt an C, C prallt an B....es kann komplizierter werden, so das man vermeintlich mehrere MAle durch den egsamten ALgo egehn müsste um alle Stöße in einem Frame reinzubekommen, jedoch muss mand as Implementieren)

Ok das wars erstmal viel Spaß bei deinem Projekt :)


ps: Sorry für die Rechtschreibfehler :(
 
  • Danke
Reaktionen: coreytaylor211
Ahh lieben Dank. Aber das Problem was ich habe ist wie spreche ich die einzelnen Positionen der Kugeln an ?
Momentan sind die Kugeln in einer Arraylist<Kugel>.
 
Achso?! Also das sollte doch kein allzu großes Problem sein denke ich ^^
Deine Klasse für die Kugeln hat doch bestimmt X und Y koordinaten oder?

Dann einfach durch eine for schleife jagen:

Code:
ArrayList<Kugel> arrList= new ArrayList<Kugel>();
for(Kugel k:arrList)
{
    int x= k.x;
    int y=k.y;
    for(Kugel j:arrList)
    {
        if(k==j) continue; //Damit man die Kugel nicht mit sich selber abfragt
        int tempX= j.x;
        int tempY= j.y;

        //Kollisionsabfrage mit x,y,tempX,tempY
    }
}

Ungefähr so sollte es ausschauen, ist halt sehr einfach gehalten und die Positionen brauchst du auch nciht extra in lokalen variablen speichern. Das wäre schon mal ne gute Schleife wo du erst mal die Kugel abfragst die in einem bestimmten Radius liegen und dann eine Arraylist erstellst und dort die Kugeln reinpackst zur feineren Kollisionsabfrage. Dieses Thema ist sehr Umfangreich und physikalisch perfekt kann man es nun nciht nachmodellieren aber es reicht bei Spielen ja dass man eine gute Annäherung erreicht.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: coreytaylor211
Ja das sieht doxh schön aus :) ich hoffe nur das es bei mit auch gehen wird, da die Arraylist ja in der main klasse deklariert ist und die ganzen Berechnungen in der Kugel Klasse.
Ich werde es gleich mal testen lieben Dank schonmal.
Ich werde gleich mal berichten ob es geklappt hat.

ps: Ja die abfrage mache ich über den Satz des pythagoras um auf die Strecke von mittelpunkt zu mittelpunkt zu kommen.
 
Ah noch ne Sache: Mach es auf jeden Fall Zentral. Die Kollisionsabfragen sollten alles von einer Entität die über die Welt wacht, sage ich mal geschehen. Quasi eine Gottfigur die deine teile überall hinbewegt und prüft etc. pp. Ich würde auch alles in deinen Game-Thread schieben.

Falls du eine gute Berechnung haben möchtest wie die Kugel dann abgestoßen werden, dann googel mal anch "Billard Spiel elastischer stoß Kugeln" oder so ähnlich.

Ist schon lange her bei mir aber ich hatte mal ne klasse Berechnung mit Hilfe von Vektoren und dem Kreuzprodukt von denen und so. Den ahbe ich aber auch nciht so ganz verstanden, wieso der funktionierte. Der war jedenfalls leichtgewichtiger als mein eigener, der noch dazu verbuggt war. Naja viel Erfolg, dass du da schnell durch bist und dich auf andere wichtige Sachen konzentrieren kannst :)
 
  • Danke
Reaktionen: coreytaylor211
So es hat alles wunderbar geklappt, habe auch noch Masse und Gravitation mit reingenommen.

Vielen dank für deine Hilfe.
 

Ähnliche Themen

P
Antworten
9
Aufrufe
1.935
pseudopat
P
C
  • coreytaylor211
Antworten
18
Aufrufe
2.369
coreytaylor211
C
Y
  • yolonaut
Antworten
1
Aufrufe
927
Jaiel
Jaiel
Zurück
Oben Unten