2016-05-16 10 views
0

Ich bin auf der Suche nach einem vereinfachten Algorithmus, um den Schnittpunkt zwischen einem OBB und einer Kugel zu testen. Es gibt Algorithmen, die ich gesehen habe, aber die meisten komplizieren die Dinge, weil sie alle 3 Drehachsen auf der OBB berücksichtigen müssen. In meinem Fall rotiert der OBB nur auf der Z-Achse, so dass ich das Gefühl habe, dass etwas zwischen dem Standard Circle/Rotated Rectangle-Algorithmus und den Sphere/OBB-Algorithmen wahrscheinlich optimaler wäre.Intersect Sphere mit OBB mit nur 1 Rotationsachse

Als Referenz wird der OBB als Vector3 für das Zentrum gespeichert, eine andere Vector3 für die Halb Dimensionen und einer Matrix33 für die Orientierung - unter Berücksichtigung, dass wir garantieren, dass, wenn Euler Rotation übersetzt, zwei der Achsen werden 0 und nur die Z-Achse wird sich ändern. Die Kugel ist nur eine Vector3 für die Mitte und eine float für Radius.

Ich vermute, dass ein solches Ding möglich sein kann, indem man einfach die Radien der Kugelquerschnitte ermittelt, die der Ober - und Unterseite der OBB entsprechen, und auch den maximalen Radius der Kugel, wenn ihr Mittelpunkt zwischen den Oben und unten, und dann eine Kollisionskontrolle Kreis/Rotated Rectangle auf jedem dieser zwei (oder drei) Radien. Was ich nicht sicher bin, ist, ob das (sowohl hinsichtlich der Codierung als auch der Leistung) einfacher ist als der vollständige Sphere/OBB-Test.

(Ich werde diese sprachunabhängig verlassen. Ich in C++ gerade arbeite, aber ich werde einen Algorithmus in jeder gemeinsamen Sprache zur Verfügung gestellt werden es einfach genug ist, um C++. Zu übersetzen)

Antwort

0

Ja, Es gibt rather simple method zum Finden der Entfernung (und Schnittpunkt) zwischen Rechteck und Kreis. Es könnte leicht für 3D-Fall und für rotierte Box erweitert werden.

In Ihrem Fall (Drehung nur um die Z-Achse) ist es einfacher, eine einfache Koordinatentransformation anzuwenden - Kugelmittelpunkt um diese Achse zu drehen - und den für die Achse ausgerichteten Kasten verwenden.

Im allgemeinen Fall würde man benötigte Distanz durch Längen von Projektionen des Vektors BoxCenter-SphereCenter auf Kantenvektoren berechnen, aber ich glaube, dass die Rotation von einem Punkt + einfache Berechnungen effektiver ist.