Schnittmenge zwischen zwei Kästchen im 3D-Raum
Ich möchte ein Kollisionserkennungssystem für meine Grafik-Engine implementieren.
Ich weiß nicht, ob dies der übliche Weg ist, aber meine Idee war, ein festes Objekt (wie ein Netz oder eine Kamera) in eine 3D-Box einzubinden, was zu genaueren Ergebnissen führt als eine Kugel.
Dieses Feld wird durch acht Eckpunkte definiert
x0 = min(vertices.x)-off // parsing mesh's vertices for the minimum x
y0 = min(vertices.y)-off
z0 = min(vertices.z)-off
x1 = max(vertices.x)+off // off avoids 2D bounding on 2D objects
y1 = max(vertices.y)+off
z1 = max(vertices.z)+off
boundingBox[0] = vec3(x0, y0, z0);
boundingBox[1] = vec3(x0, y1, z0);
boundingBox[2] = vec3(x1, y0, z0);
boundingBox[3] = vec3(x1, y1, z0);
boundingBox[4] = vec3(x0, y0, z1);
boundingBox[5] = vec3(x0, y1, z1);
boundingBox[6] = vec3(x1, y0, z1);
boundingBox[7] = vec3(x1, y1, z1);
achdem ich den Begrenzungsrahmen in Weltkoordinaten umgewandelt habe, suche ich nach einer Möglichkeit, um zu überprüfen, ob es eine Schnittmenge zwischen zwei von ihnen gibt, aber ich weiß nicht, wie ich das mit linearer Algebra machen sol
Ich dachte, wenn ich sicher wäre, dass alle Kästchen parallel zur XZ-Ebene liegen, könnte ich einfach alle Eckpunkte von Kästchen1 mit den Min / Max-Koordinaten von Kästchen2 vergleichen:
for(int i = 0; i < 8; i++) {
if(box1[i].x >= box2.minX && box1[i].x <= box2.maxX) &&
(box1[i].y >= box2.minY && box1[i].y <= box2.maxY) &&
(box1[i].z >= box2.minZ && box1[i].z <= box2.maxZ) {
// collision here
}
}
Aber dies wird nicht funktionieren, da die Maschen möglicherweise gedreht wurden. Gibt es eine mathematische Formel, die ich verwenden kann?