Kollision von zwei Kreisen - Überlappung verhindern



  • Hallo,

    folgendes Szenario:
    Zwei Kreise stoßen aufeinander, wie geht man hier vor, detektiert man vor der Änderung der Position ob im nächsten Frame die beiden Kreise sich treffen(im worst case überlappen) und berechnet dann bei der Bewegung der zwischen dem aktuellen und dem nächsten Frame liegenden Stoß mit ein?
    Oder akzeptiert man Überlappung und schaut nur ob sich die Kreise aktuell stoßen?

    Geschwindigkeit und Größe sind derart, dass ein durchfliegen nicht vorkommt



  • Eigentlich wollte ich nur wissen, ob die einfachere Variante(letztere) extrem hässlich wirkt



  • Beide Kreise haben jeweils einen Radius und wenn die Strecke zwischen den beiden Kreisen kleiner als die Gesamtgröße der beiden aufeinander addierten Radien ist, dann stoßen die Kreise zusammen.

    Kein Mensch macht die Kollisionserkennung an jedem einzelnen Punkt des Kreisrings, das ist viel zu aufwendig.



  • Oder akzeptiert man Überlappung

    Sollte Überlappung nicht verhindert werden? Ich bin verwirrt.

    Wenn du Stöße berechnen möchtest, dann machst du das folgendermaßen:

    Du prüfst in jedem Schritt, ob sich die Kreise überlappen. Also prüfen ob der Abstand der Kreismittelpunkte größer ist als die Summe der Radien beider Kreise. Ganz einfach.

    Wenn das der Fall ist kannst du dann bspw. den Stoß elastisch simulieren (bspw. stärker wenn eine größere Überlappung vorliegt), oder machen was du auch immer willst.

    Ich bin mir aber einfach nicht sicher, was du überhaupt willst.



  • Mal n kurzes Beispiel (1D):

    Ball A ist bei 0 und hat Radius 1, Ball B ist bei 2.5 und hat ebenso Radius 1.
    Beide haben ne Geschwindigkeit von 1 und bewegen sich aufeinander zu.
    Im nächsten Frame wäre A bei 1 und B bei 1.5, wegen des Radiuses von 1 überlappen sich beide.z
    Würde ich das zeichnen, steckten die Kreise ineinander.
    Nun könnte man bevor man die Kreise bewegt untersuchen, ob sie sich mit der nächste Bewegung überschneiden und falls ja die Bälle eben nicht einfach um 1 vorrücken lassen, sondern den zwischen dem gegenwärtigen Frame und dem nächsten liegenden Stoß einberechnen und so niemals überlappende Bälle zeichnen.

    Prinzipiell könnte ich das auch jetzt schon, allerdings wirkt das vorgehen in meinem Kopf recht kompliziert, daher war meine Frage darauf abzielend, ob die "optimierte" Lösung womöglich viel zu aufwendig für eine derart kleine Verbesserung ist.



  • Hallo, also ich habe jetzt einfach die simple Variante genommen, dass man in jedem Frame eben überprüft ob sich Kreise überlappen und falls ja wird ein idealelastischer Stoß durchgeführt.

    Folgendes Problem trat noch auf:
    Stoßen sich zwei Kreise und zeitlich stößt einer dieser Kreise die Wand konnte es passieren, dass die Kreise zusammenpappten.
    Hier ein Bild der Situation: http://up.picr.de/14453235oh.jpg

    In diesem Fall kommt es vor, dass nach dem Stoß der Kreise der linke Kreis direkt die Wand stößt und damit der vorherige Stoß der Kreise quasi unwirksam wird.
    Daraufhin gleiten die Kreise ineinander und die Simulation würde zwei Frames benötigen um die Kreise zu lösen, allerdings interpretiert die Standardkollisionsüberpüfung jedes Frame als normale Kollision und will daher einen Stoß ausführen, weswegen die Kreise anfangen um einen der Überlappungspunkte zu schwingen.

    Ich habe dies nun so gelöst, dass ich vor dem Ausführen der Stoßsimulation(also des expliziten Änderns der Geschwindigkeitsrichtung) ich schaue ob eine sehr kleine Verrückung in Richtung der momentanen Ausbreitungsrichtung die Entfernung der Kreise erhöhen würde (quasi eine virtuelle Verrückung). Ist dies der Fall führe ich jetzt keinen Stoß mehr durch. Läuft scheinbar ganz gut.(Fehler behoben).

    Gibt es da andere Ansätze? Will nicht ausschließen, dass nicht doch auftreten könnte, dass mein Zusatztest eine Logiklücke aufweist.



  • Normalerweise berechnet man einfach den Zeitpunkt der fruehsten Kollision, falls es in dem Frame eine gibt. Dann fuehrt man einen Kollision zu diesem Zeitpunkt durch und sucht ab diesem Zeitpunkt wieder neu nach Kollisionen bis sich keine mehr finden lassen.


Anmelden zum Antworten