Ich versuche herauszufinden, wie man einen KD-Baum implementiert.
Auf Seite 322 von "Echtzeit-Kollisionserkennung" von Ericson
Der Textabschnitt ist unten enthalten, falls Sie ihn in der Google Buchvorschau nicht sehen können, wenn Sie auf den Link klicken
Relevanter Abschnitt:
Die Grundidee, einen Strahl oder ein gerichtetes Liniensegment mit einem kd-Baum zu schneiden, ist einfach. Die Linie wird gegen die Teilungsebene des Knotens geschnitten, und der t-Wert der Schnittmenge wird berechnet. Befindet sich t innerhalb des Intervalls der Linie, 0 <= t <= tmax, so überspannt die Linie die Ebene, und beide untergeordneten Elemente des Baums werden rekursiv herabgestuft. Wenn nicht, wird nur die Seite mit dem Segmentursprung rekursiv besucht.
Folgendes habe ich also: ( Bild in neuem Tab öffnen, wenn der Schriftzug nicht zu sehen ist)
Der logische Baum
Hier geht der orange Strahl durch die Szene 3d. Die x repräsentieren den Schnittpunkt mit einer Ebene. Von LINKS trifft der Strahl:
- Die Vorderseite des umgebenden Würfels der Szene,
- Die (1) Teilungsebene
- Die (2.2) Aufteilungsebene
- Die rechte Seite des umgebenden Würfels der Szene
Aber hier ist, was passieren würde, naiv nach Ericsons grundlegender Beschreibung oben:
- Gegen Spaltfläche (1) prüfen. Der Strahl trifft auf die Teilungsebene (1), sodass die linken und rechten Kinder der Teilungsebene (1) in den nächsten Test einbezogen werden.
- Test gegen Spaltfläche (2.1). Ray trifft tatsächlich dieses Flugzeug (weit rechts), sodass beide Kinder in die nächste Teststufe einbezogen werden. (Dies ist kontraintuitiv - sollte nicht nur der untere Knoten in nachfolgenden Tests enthalten sein)
Kann jemand beschreiben, was passiert, wenn der orangefarbene Strahl die Szene korrekt durchläuft?