AABB - AABB Kollision, welches Gesicht treffe ich?

7

Damit meine Objekte bei einer Kollision gleiten können, muss ich:

  • Wissen Sie, mit welchem ​​Gesicht des AABB sie kollidieren.
  • Berechnen Sie die Normalen zu diesem Gesicht.
  • Geben Sie die Normalen zurück und berechnen Sie den Impuls, der auf die Geschwindigkeit des Spielers angewendet werden soll.

Frage

Wie kann ich berechnen, mit welchem ​​Gesicht des AABB ich kollidiert habe, wenn ich weiß, dass zwei AABB kollidieren? Einer ist der Spieler und der andere ist ein Weltobjekt.

So sieht das aus (Problemkollision weiß eingekreist):

Problem Kollision

Danke für deine Hilfe.

PeeS
quelle

Antworten:

2

Überprüfen Sie jede einzelne Ebene des AABB mit der anderen AABB. Wenn eine Ebene den AABB des anderen Objekts schneidet, die gegenüberliegende Ebene jedoch nicht, wissen Sie, dass diese Ebene an der Kollision beteiligt ist. Wenn beide gegenüberliegenden Flächen den anderen AABB schneiden, befindet sich das Objekt entlang dieser Achse vollständig im anderen und die Kollisionsrichtung ist mehrdeutig / undefiniert.

In der Praxis sind dies dieselben Überprüfungen, die verwendet werden, um festzustellen, ob AABBs kollidieren. Sie sollten also in der Lage sein, zu bestimmen, welche Flächen bei der AABB-Kollisionsprüfung mit geringen zusätzlichen Kosten kollidieren.

Wenn wir uns das Beispiel ansehen, sehen wir Folgendes:

  • Die yz + -Ebene der Kugel schneidet das Prisma, yz- jedoch nicht. Kugel yz + kollidiert. In ähnlicher Weise kollidiert das yz des Prismas.
  • Sowohl das Prisma xy- als auch das xy + befinden sich innerhalb des xy- und xy + der Kugel. Das Prisma befindet sich in z-Richtung vollständig innerhalb der Kugel. Kollision ist mehrdeutig.
  • Sowohl das Prisma xz- als auch das xz + befinden sich innerhalb des xz- und xy + der Kugel. Das Prisma befindet sich in y-Richtung vollständig innerhalb der Kugel. Kollision ist mehrdeutig.

In diesem Beispiel erkennen wir also eine Kollision zwischen der Kugel yz + und dem Prisma yz-.

Die Normalen aller Gesichter sollten offensichtlich sein (yz + hat (1,0,0), yz- hat (-1,0,0), xz- hat (0, -1,0) ...) Im Allgemeinen, wenn Ein Quad hat die Eckpunkte (a, b, c, d) gegen den Uhrzeigersinn, dann können Sie die Normalen mit (ba) .cross (cb) berechnen.

Beachten Sie, dass dieses Problem die Möglichkeit mehrerer Kollisionen bietet: Abhängig von der Positionierung können Kollisionen in allen drei Achsen auftreten. Ich denke, diese „Mehrdeutigkeit“ ist ziemlich inhärent, und wie Sie sie lösen, liegt wirklich bei Ihnen. Sie können einfach den Durchschnitt der einzelnen Normalen nehmen. Sie können den Schnittbereich in jeder Ebene finden und dann die Normale auswählen, die der größten Fläche entspricht, oder die Bereiche verwenden, um den Durchschnitt der Normalen zu gewichten. Sie können die Eindringtiefe entlang jeder Achse ermitteln und die Normale auswählen, die dem flachsten (oder tiefsten) Eindringen entspricht. Usw. usw.

ipeet
quelle
Könnte das nicht einfacher sein? Danke ipeet - noch ein langer Tag, Wochen für mich, um zu versuchen, es zu codieren ..
PeeS
@PeeS - Ich denke, das ist wahrscheinlich etwas, was schon oft gemacht wurde. Vielleicht sollten Sie sich umschauen, wie andere Leute es implementiert haben.
Richard Marskell - Drackir