2016-05-29 23 views
0

Ich versuche etwas zu verstehen, das wahrscheinlich viel einfacher ist, als ich gerade denke, also könnte mir hoffentlich jemand helfen, das zu verstehen, was ich unten beschreibe.Auswahl der Sphäre/Kegelstumpf-Überlappungstest

Ich weiß, dass eine Sphäre außerhalb des View-Frustums liegt, wenn sie sich hinter mindestens einer der sechs Kegelstumpf-Ebenen in 3D (links, rechts, unten, oben, nahe weit) befindet. Dies gilt für den Kreis mit dem Mittelpunkt c2 im folgenden Beispiel, der vollständig außerhalb der linken Ebene liegt. Der Überlappungstest wird einfach durchgeführt, indem die Mittenkoordinaten der Kugel in die Ebenengleichung eingefügt werden, um den Abstand von der Mitte zu der Ebene zu erhalten, und dann mit dem Radius der Kugel verglichen wird.

Die Verwendung dieses Ansatzes auf der Kugel mit c1 wird uns jedoch ein falsch positives Ergebnis geben, da der Test uns zeigt, dass die Kugel innerhalb der rechten und der fernen Ebene liegt (von oben gesehen). Die Lösung besteht dann darin, einen exakteren Überlappungstest zu verwenden, indem der Abstand von der Kugelmitte zu der Ecke des Sichtstumpfes bestimmt wird, der ihr am nächsten ist. Wenn dieser Abstand größer als der Radius ist, ist der Bereich außerhalb des Stumpfes usw.

Spheres and viewing frustum

Was ich nicht verstehe ist, was passiert, wenn wir diesen zweiten Ansatz verwenden, suchen Sie in den Ecken statt der Ebenen, auf einer Kugel wie die mit c3. Wird der Test nicht ergeben, dass der Abstand vom Kugelzentrum minus dem Radius größer als 0 und damit außerhalb des Betrachtungsvolumens ist?

Also, wenn eine Reihe von Regeln für ein orthographisches Ansichtsvolumen gegeben ist, dh 0 ≤ x ≤ 20, -5 ≤ 15, -5 ≤ z ≤ 18, und x, y, z-Koordinaten + Radius einer Kugel und sagte zu bestimmen, ob die Kugel innerhalb oder außerhalb ist. Wie wähle ich, welche Methode zu verwenden, um wirklich die richtige Antwort zu erhalten?

Antwort

1

In der Tat müssen Sie beide:

  1. Sie müssen prüfen, ob Testkugel schneidet/innerhalb des Stumpfes (6 Ebenen) - Ihre first approach.
  2. Dann (wenn 1 wahr ist) und Abstand ist < -R - die Kugel ist vollständig innerhalb.
  3. Ansonsten haben Sie Kreuzung überprüfen Koordinaten auf Ebenen (wenn mindestens ein red Kreuz auf black Segment bekam man Kreuzung): enter image description here

Implementierung von 3 könnte schwierig sein, so sind hier zwei Links:

http://www.realtimerendering.com/intersections.html http://www.geometrictools.com/Source/Intersection3D.html

wo Sie die Frustrum-Sphere Kreuzung Algo finden können.

Aber geometrictools Implementierung verwendet FindMinDistance Algo, die komplizierter ist. Sie können ihre Implementierung überprüfen (Wm5DistPoint3Frustum3.cpp) und sie nur an itersection anpassen.

+0

Das macht Sinn, jetzt verstehe ich. Vielen Dank! –