Kollision



  • hallo wenn ich jetzt 2 boundingboxes hab, und deren eckpunkte weiß, wie berechne ich am geschicktesten ob diese sich überschneiden?

    hab echt keine ahnung und bin für jede möglichkeit dankbar, häng grad total



  • Testen ob einer der Eckpunkte des einen Rechtecks im anderen liegt.



  • wie verwirklicht man sowas
    (in pseudo oder c++ code?)

    geht des nicht auch mit abständen der mittelpunkte?

    bilder wie dieses würden ja fälschlicherweise nicht als kollision erkannt

    +-----------------------------+
    | |
    | +-----+ |
    | | | |
    | +-----+ |
    +-----------------------------+



  • Du kannst die abstände der mittelpunkte prüfen...(was aber nur was bringt wenns ein kreis sein soll...weil wenn es ein flaches rechteck ist gibts vermutlich fehlkollisionen)

    Oder...du prüfst:

    rechteck1.eckpunkt1.x <= rechteck2.eckpunkt1.x <= rechteck1.eckpunkt2.x
    

    Dann für y und z
    ....für jeden Punkt
    usw



  • Ich gehe mal davon aus, dass sich Deine beiden Objekte bewegen - dann könntest Du ja auch eventuell die Schrittweite soweit anpassen, dass es zwischen zwei Schritten gar nicht dazu kommen kann, dass sich ein Objekt plötzlich ganz im anderen befindet.

    Ansonsten Rechteckkollision:
    guck mal hier: http://www.back-side.net/codingrects.html#iii
    x und z sind die Eckpunkte unten links im Rechteck, w sind die Weiten und h die Höhen der Rechtecke:
    x1,x2,z1,z2,w1,w2,h1,h2

    if( !(x1+w1 < x2 || x1 > x2+w2 || z1+h1 < z2 || z1 > z2+h2) )
      //Kollision
    else
      //keine Kollision
    


  • kann mir einer bitte rechteck-kollision einmal vorführen, komplett? 2D?

    ich versuche nebenbei die abstandsvariante , in leicht angepasster form



  • Ob Eckpunkte irgendwo drin sind, ist egal, weil sich die Boxen schneiden koennen, ohne das sowas passiert. Stattdessen einfach nach eine seperation Axis suchen. f'`8k

    Autocogito

    Gruß, TGGC (Der neue Game Star)



  • TGGC schrieb:

    Ob Eckpunkte irgendwo drin sind, ist egal, weil sich die Boxen schneiden koennen, ohne das sowas passiert. Stattdessen einfach nach eine seperation Axis suchen. f'`8k

    Autocogito

    Gruß, TGGC (Der neue Game Star)

    Wenn die Schritte zu groß sind kann das natürlich passieren...

    Hier gibts ein Tut zu SAT:http://wiki.delphigl.com/index.php/Tutorial_Separating_Axis_Theorem


  • Mod

    ravenheart schrieb:

    wie verwirklicht man sowas
    (in pseudo oder c++ code?)

    geht des nicht auch mit abständen der mittelpunkte?

    bilder wie dieses würden ja fälschlicherweise nicht als kollision erkannt

    +-----------------------------+
    |                             |
    |         +-----+             |
    |         |     |             |
    |         +-----+             |
    +-----------------------------+
    

    1. generiere aus der jetzigen und der alten position fuer jedes rechteck ein polygon (ist nicht so schwierig wie es klingt 😉 ).

    2. pruefe ob sich die boundingboxen der zwei polygone ueberlappen (simpler+schneller test).

    3. falls ja, pruefe jede kante von dem einen polygon gegen jede vom zweiten, du brauchst dafuer nicht den schnittpunkt bestimmen, es gibt relativ schnelle test formeln die nur aussagen _ob_ es einen schnittpunkt gibt.



  • abstände vom mittelpunkt?

    das ist mathematik der 5. klasse!

    Ein Rechteck definiert sich über eine linke obere und eine rechte untere Ecke, dann kann man wie folgt sehr simpel testen:

    template <typename T> 
    bool Intersection(const Rect<T> &lhs, const Rect<T> &rhs) 
    {
      return ((lhs.Bottom > rhs.Top)  && (lhs.Top  < rhs.Bottom) &&
              (lhs.Right  > rhs.Left) && (lhs.Left < rhs.Right));
    }
    

    Left => x-Koordinate der linken oberen Ecke
    Top => y-Koordinate der linken oberen Ecke
    Right => x-Koordinate der rechten unteren Ecke
    Bottom => y-Koordinate der rechten unteren Ecke



  • Sunday schrieb:

    abstände vom mittelpunkt?

    das ist mathematik der 5. klasse!

    Ein Rechteck definiert sich über eine linke obere und eine rechte untere Ecke, dann kann man wie folgt sehr simpel testen:

    template <typename T> 
    bool Intersection(const Rect<T> &lhs, const Rect<T> &rhs) 
    {
      return ((lhs.Bottom > rhs.Top)  && (lhs.Top  < rhs.Bottom) &&
              (lhs.Right  > rhs.Left) && (lhs.Left < rhs.Right));
    }
    

    Left => x-Koordinate der linken oberen Ecke
    Top => y-Koordinate der linken oberen Ecke
    Right => x-Koordinate der rechten unteren Ecke
    Bottom => y-Koordinate der rechten unteren Ecke

    Unsinn. Um ein Rechteck zu definieren reichen 2 Eckpunkte nicht aus. Das funktioniert daher nur in Sonderfaellen so. f'`8k

    Autocogito

    Gruß, TGGC (Der neue Game Star)


Log in to reply