2 Stimmen

Kollisionsberechnung von AABB

Ich baue ein Spiel in OpenGL. Das Spiel besteht aus einem Flugzeug, das frei in einer 3D-Welt fliegt und durch bestimmte Bereiche fliegen muss, als würde es durch Fenster fliegen. Im Moment versuche ich, die Kollision des Flugzeugs mit diesen "Fenstern" zu berechnen. Ich dachte als ersten Ansatz daran, ein Sweep-AABB für die Flugbahn des Flugzeugs zu haben und einige AABBs für jedes Fenster, so dass, wenn sich diese AABBs überschneiden, potenzielle Fälle von Durchflügen des Flugzeugs vorhanden sind. Aber das Problem beginnt, wenn ich versuche, die AABBs zu berechnen, da jeder Algorithmus, den ich kenne, die Koordinaten beider Objekte (Flugzeug+Fenster) im selben Bezugssystem kennen muss. Mein Programm zeichnet die Welt so, als ob sie sich bewegen würde, anstatt das Flugzeug, das immer im Ursprung zentriert ist (eigentlich bei z=-10, also wird es gerendert). Das eigentliche Problem ist, wie man die Koordinaten jedes "Fensters" berechnet, wie sie aus dem Flugzeug gesehen werden. Dies ist der Code, den ich zum Zeichnen der Szene verwende:

glLoadIdentity();

//das sind die Rotationen des Flugzeugs auf dem Boden
glRotatef(RotHorizont, 0.0f, 0.0f, 1.0f);
glRotatef(-directionX, 1.0f, 0.0f, 0.0f);
glRotatef(-directionY, 0, 1.0f, 0);

//und das sind die Bewegungen des Flugzeugs
//(die Multiplikation mit 0.0174532925f dient der Umrechnung der Winkel in Radianten
Tx -= (float)Math.sin(directionY * 0.0174532925f) * velocity;
Tz -= (float)Math.cos(directionY * 0.0174532925f) * velocity;
Ty -= (float)Math.sin(directionX * 0.0174532925f) * velocity;

glTranslatef(-Tx, Ty, -Tz);

/*
hier zeichne ich den Boden und die Fenster
*/
....

//und jetzt zeichne ich das Flugzeug
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -10.0f);
/* zeichne das Flugzeug */

Also, wie zum Teufel bekomme ich die Koordinaten der "Fenster"? Oder gibt es einen anderen Weg, die Kollision zu berechnen? Ich brauche wirklich eure Hilfe, ich werde es sehr schätzen. Vielen Dank an alle!

3voto

nylund Punkte 1105

Dies ist ein wirklich gutes Buch zum Thema: http://realtimecollisiondetection.net/

Alternativ hat diese Seite auch eine gute Sammlung von Methoden zur Berechnung von Kollisionen zwischen verschiedenen Typen: http://www.realtimerendering.com/intersections.html

2voto

BenC Punkte 8359

Sie können ein AABB durch eine Position (3-Koordinaten-Vektor) und seine Größe (3-Koordinaten-Vektor) definieren und einen beliebigen AABB-Kollisionsdetektionsalgorithmus anwenden, um Ihr Problem zu lösen.

Wie Sie bereits angemerkt haben, muss die Berechnung im gleichen Koordinatensystem erfolgen. Da Sie jedoch mit AABBs (und nicht mit OBBs) arbeiten, müssen Sie sich nicht mit der Ausrichtung befassen (entweder wird das AABB so berechnet, dass sich das Objekt darin befindet, nachdem es gedreht wurde, oder Sie berechnen es nach jeder Objektdrehung neu). Da "AA" für "Axis-Aligned" steht, haben Sie normalerweise bereits ein gemeinsames Bezugssystem (ansonsten wären es OBBs). Daher wäre die einzige "Konvertierung", die möglicherweise erforderlich wäre, eine Translation.

Wenn das Zentrum Ihrer Ebene das Zentrum Ihres Koordinatensystems ist, wird die Position des AABB Ihrer Ebene (0,0,0) sein (oder (0,0,-10)). Bei Ihren Fenstern hängt es davon ab, wie Sie diese definieren, aber es sollte recht einfach sein, ihre Zentren zu finden (mit OpenGL arbeiten Sie mit Produkten von Transformationsmatrizen, finden Sie diejenigen, die Sie vom ursprünglichen Koordinatensystem zum Fenstersystem führen). Wenn Sie mehr Informationen bereitstellen, könnten wir Ihnen einige weitere Details geben, wie Sie das erreichen können.

Links:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X