2D Kollisionsreaktion: Zwei Bewegte Objekte



  • Hi,

    Ich suche nach einem guten Ansatz für eine Kollisionsreaktion zwischen zwei bewegten Objekten in einem 2D Jump'n'Run. An dieser Stelle (http://www.c-plusplus.net/forum/topic,39431.html) im FAQ gabs ja schon ne Antwort für eine Kollision zwischen einem Bewegten und einem Unbewegten Objekt (nämlich Sliden), aber wie mach ich das nun zwischen zwei bewegten Objekten ?? Hat da irgendwie einer einen generellen Ansatz für dieses vergleichsweise primitive Problem ?

    Danke im Voraus,
    achim2310



  • Wo ist der Unterschied ob das Objekt bewegt oder starr ist?
    In nem 2D Spiel würd ich Bounding Rects benutzen. Schau mal bei www.scherfgen-software.net nach da gibts ein Tut dazu.

    Edit: Url war Falsch



  • Was genau bewegt sich denn da und wie willst Du reagieren?!?
    Wenn 2 Kugeln aufeinander prallen sollten die wieder auseinaderfliegen nach dem Gesetz der Impulserhaltung...
    Erklär' mal bitte genauer, was Du erreichen willst.



  • Hi,

    Wie gesagt, es geht mir nicht um die Kollisionserkennung, sondern um eine richtige Reaktion, d.h. wie muss ich die Rechtecke verschieben, damit sie nicht mehr kollidieren. Und da ist es schon ein Unterschied, wenn zwei Objekte bewegt oder eben nur eines bewegt und das andere fest ist. Wenn nämlich beide sich bewegen können, muss ich doch grundsätzlich auch nach einer Kollision beide so verschieben, dass sie nicht mehr kollidieren. Ist dagegen eins unbewegt, bleibt das fest und das andere slidet dran entlang... oder mach ich gerade einen Denkfehler ? Ich glaube nicht, denn wenn man nochmal im FAQ nachschaut: Da gibts auch verschiedene "Collision" Funktionen...



  • ... aber leider ist im FAQ nur die Collision Funktion für "bewegt mit unbewegt" aufgeführt ...



  • achim2310 schrieb:

    Wie gesagt, es geht mir nicht um die Kollisionserkennung, sondern um eine richtige Reaktion, d.h. wie muss ich die Rechtecke verschieben, damit sie nicht mehr kollidieren. Und da ist es schon ein Unterschied, wenn zwei Objekte bewegt oder eben nur eines bewegt und das andere fest ist. Wenn nämlich beide sich bewegen können, muss ich doch grundsätzlich auch nach einer Kollision beide so verschieben, dass sie nicht mehr kollidieren. Ist dagegen eins unbewegt, bleibt das fest und das andere slidet dran entlang... oder mach ich gerade einen Denkfehler ? Ich glaube nicht, denn wenn man nochmal im FAQ nachschaut: Da gibts auch verschiedene "Collision" Funktionen...

    Hi. :p
    Bei der stat./dyn. Kollision kannst Du herausfinden, wie viel des Bewegungsvektors das dyn. Objekt sich bewegen muß, um SO GERADE das stat. zu berühren. Diese Zahl liegt zwischen 0.0 und 1.0.
    Das dyn./dyn. Problem kannst Du auf das gleiche reduzieren, da Du von einem dyn. den Bew.Vek. auf das andere Objekt anrechnest. D.h. Du beachtest nur die Relativbewegung. Die wiederum rausgefundene "Laufweite" x | 0.0 <= x <= 1.0 kannst Du auf beide Bewegungsvektoren anrechnen und erhälst den exakten First-Time-Of-Contact.
    Das hat aber auch noch mit der Kollisionserkennung (!) zu tun, aber scheinbar willst Du das nicht?!?!



  • 3 generelle Ansätze:
    - beides bleibt stehen
    - das kleinere Objekt wird reflektiert
    - das kleinere Objekt fliegt auf seiner Bahn zurück

    Bye, TGGC (Der Held ist zurück)



  • Sgt. Nukem schrieb:

    Das hat aber auch noch mit der Kollisionserkennung (!) zu tun, aber scheinbar willst Du das nicht?!?!

    Also ich les da oben "Kollisions_reaktion_". 😉



  • TGGC schrieb:

    Sgt. Nukem schrieb:

    Das hat aber auch noch mit der Kollisionserkennung (!) zu tun, aber scheinbar willst Du das nicht?!?!

    Also ich les da oben "Kollisions_reaktion_". 😉

    Jo, eben. Das Problem daß er beschrieben hat schien mir aber noch in der Kollisions_erkennung_ zu liegen... deswegen bin ich leicht verunsichert, was er überhaupt von uns will... 😕 😉



  • Ups, haben wohl gleichzeitig geschrieben...

    Also, in meinem Spiel gibts nur Rechtecke, d.h. so speziell "Impulzerhaltung" möcht ich zunächst garnicht werden (das kommt dann später vielleicht). Angenommen ich hab zwei Rechtecke: Das eine bewegt sich in Richtung Süd-Südost (also Vektor (1 , 2) multipliziert mit irgend nem Faktor t) das andere in Richtung Süd-Südwest (also Vektor (-1, 2) multipliziert mit irgend nem Faktor k) und die liegen halt so nah aneinander, dass sie sich treffen. Was muss ich jetzt machen ? Schnittpunkt ausrechnen und dann Positionen mit Hilfe des Schnittpunkts setzen ? Und wie muss ich dann die Richtungsvektoren der Rechtecke setzen (="Auseinanderprallen" -> wie gesagt, muss nicht so physikalishc korrekt sein, da ja sowieso alle Objekte in meinem Spiel wie Rechtecke behandelt werden [also auch Kreise] ...



  • Ups, geht ja richtig flott hier: Ob das jetzt Kollisionserkennung oder Reaktion ist... Bei mir ist Kollisionsrekennung: Zwei Rechtecke überschneiden sich. Kollisionsreaktion: Positionen so setzten, dass keine Kollision mehr stattfindet, den Rest macht dann die "KI"



  • Mögliche Methoden nannte ich. Du musst dir nun die passende aussuchen oder einfach alle einbauen.

    (BTW: stimmt nicht, war eine Minute später)

    Bye, TGGC (Der Held ist zurück)



  • TGGC schrieb:

    (BTW: stimmt nicht, war eine Minute später)

    Nö. Kann mich ja gar nicht gemeint haben, der Beitrag war ja nicht editiert... 🤡

    achim2310 schrieb:

    [...] und die liegen halt so nah aneinander, dass sie sich treffen. Was muss ich jetzt machen ? Schnittpunkt ausrechnen und dann Positionen mit Hilfe des Schnittpunkts setzen ? Und wie muss ich dann die Richtungsvektoren der Rechtecke setzen (="Auseinanderprallen" -> wie gesagt, muss nicht so physikalishc korrekt sein, da ja sowieso alle Objekte in meinem Spiel wie Rechtecke behandelt werden [also auch Kreise] ...

    TGGC schrieb:

    3 generelle Ansätze:
    - beides bleibt stehen
    - das kleinere Objekt wird reflektiert
    - das kleinere Objekt fliegt auf seiner Bahn zurück

    Zuästzlich:
    - Beide werden reflektiert (billig)
    - Beide fliegen auf ihrer Bahn zurück
    - Beide werden entsprechend ihren Massen reflektiert (Impulserhaltung)

    ➡
    a) Beide Bew.Vek. auf 0 setzen
    b) Einfallwinkel/Ausfallwinkel (an Normale spiegeln)
    c) Bew.Vek. des kleineren * -1
    d) s. b)
    e) s. c) für beide
    f) m * v muß vorher/nachher gleich sein, ansonsten s. b)


Log in to reply